[英]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.