使用带有java的regexp替换多个捕获组

sse*_*sen 7 java regex

我有这个要求 - 对于输入字符串,如下所示

8This8 is &reallly& a #test# of %repl%acing% %mul%tiple 9matched9 9pairs
Run Code Online (Sandbox Code Playgroud)

我想剥离匹配的单词边界(匹配对为8或&或%等),并将导致以下结果

This is really a test of repl%acing %mul%tiple matched 9pairs
Run Code Online (Sandbox Code Playgroud)

用于这些对的字符列表可以变化,例如8,9,%,#etc,并且只有与每种类型匹配开头和结尾的单词将被剥离这些字符,并且在单词中保留相同的字符它是.

使用Java我可以做一个模式\\b8([^\\s]*)8\\b和替换为$ 1,以捕获和替换所有出现的8 ... 8,但是我如何对所有类型的对进行此操作?

我可以提供一个类似\\b8([^\\s]*)8\\b|\\b9([^\\s]*)9\\b..等等的模式来匹配所有类型的匹配对*8,9,..),但是如何指定'变量'替换组 -

例如,如果比赛是9 ... 9,则替换应为2美元.

我当然可以通过其中的多个来运行它,每个都替换一个特定类型的对,但我想知道是否有更优雅的方式.

还是有一种完全不同的方法来解决这个问题?

谢谢.

Avi*_*Raj 4

您可以使用下面的正则表达式,然后将匹配的字符替换为组索引 2 中存在的字符。

(?<!\S)(\S)(\S+)\1(?=\s|$)
Run Code Online (Sandbox Code Playgroud)

或者

(?<!\S)(\S)(\S*)\1(?=\s|$)
Run Code Online (Sandbox Code Playgroud)

Java正则表达式是,

(?<!\\S)(\\S)(\\S+)\\1(?=\\s|$)
Run Code Online (Sandbox Code Playgroud)

演示版

String s1 = "8This8 is &reallly& a #test# of %repl%acing% %mul%tiple 9matched9 9pairs";
System.out.println(s1.replaceAll("(?<!\\S)(\\S)(\\S+)\\1(?=\\s|$)", "$2"));
Run Code Online (Sandbox Code Playgroud)

输出:

This is reallly a test of repl%acing %mul%tiple matched 9pairs
Run Code Online (Sandbox Code Playgroud)

解释:

  • (?<!\\S)负向后查找,断言匹配前面不会有非空格字符。
  • (\\S)捕获第一个非空格字符并将其存储到组索引 1 中。
  • (\\S+)捕获一个或多个非空格字符。
  • \\1指第一个捕获组内的角色。
  • (?=\\s|$)并且匹配项后面必须跟一个空格或行尾锚点。
  • 这可确保字符串的第一个字符和最后一个字符必须相同。如果是,则它将用组索引 2 中存在的字符替换整个匹配项。

对于这种特定情况,您可以将上述正则表达式修改为:

String s1 = "8This8 is &reallly& a #test# of %repl%acing% %mul%tiple 9matched9 9pairs";
System.out.println(s1.replaceAll("(?<!\\S)([89&#%])(\\S+)\\1(?=\\s|$)", "$2"));
Run Code Online (Sandbox Code Playgroud)

演示版