[英]how to replace multiple matched Regex
我有一組需要應用於一組String的正則表達式替換,
例如:
("\\s{2,}" --> " ")
(\\.([a-zA-Z]-->". $1")
所以我會有這樣的事情:
String s="hello .how are you?";
s=s.replaceAll("\\s{2,}"," ");
s=s.replaceAll("\\.([a-zA-Z])",". $1");
....
但是想象一下,我想在長字符串上替換100多個這樣的表達式。 不用說這可能有多慢。
所以我的問題是,是否有更有效的方法來使用單個replaceAll(或類似的東西,例如Pattern / Matcher)來推廣這些替換
我跟着Java替換了多個不同的... ,
但問題是我的正則表達式不是simple Strings
。
你有這兩個replaceAll
調用:
s = s.replaceAll("\\s{2,}"," ");
s = s.replaceAll("\\.([a-zA-Z])",". $1");
您可以將它們組合成單個replaceAll
如下所示:
s = s.replaceAll("\\s{2,}|(\\.)(?=[a-zA-Z])", "$1 ");
查看一次替換多個子字符串並進行修改。
使用Map<Integer, Function<Matcher, String>>
。
修改循環以檢查匹配的組。 然后使用該組號獲取替換lambda。
偽代碼
Map<Integer, Function<Matcher, String>> replacements = new HashMap<>() {{
put(1, matcher -> "");
put(2, matcher -> " " + matcher.group(2));
}};
String input = "lorem substr1 ipsum substr2 dolor substr3 amet";
// create the pattern joining the keys with '|'. Need to add groups for referencing later
String regexp = "(\\s{2,})|(\\.(?:[a-zA-Z]))";
StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile(regexp);
Matcher m = p.matcher(input);
while (m.find()) {
//TODO change to find which groupNum matched
m.appendReplacement(sb, replacements.get(m.group(groupNum)));
}
m.appendTail(sb);
System.out.println(sb.toString()); // lorem repl1 ipsum repl2 dolor repl3 amet
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.