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

我有一组需要应用于一组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>

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

修改循环以检查匹配的组。 然后使用该组号获取替换lambda。

伪代码

 Map> 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