繁体   English   中英

如何替换多个匹配的正则表达式

[英]how to replace multiple matched Regex

我有一组需要应用于一组String的正则表达式替换,

例如:

  1. 具有单个空格的所有多个空格("\\s{2,}" --> " ")
  2. 所有。 然后是一个char。 后跟空格后跟char (\\.([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 ");

RegEx演示

查看一次替换多个子字符串并进行修改。

使用Map<Integer, Function<Matcher, String>>

  • 组号为整数键
  • Lambdas作为价值观

修改循环以检查匹配的组。 然后使用该组号获取替换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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM