用java将regexp替换多个捕获组

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

8This8 is &reallly& a #test# of %repl%acing% %mul%tiple 9matched9 9pairs

我想去掉匹配的单词边界(匹配对是8或者或者%等),并且会导致以下结果

This is really a test of repl%acing %mul%tiple matched 9pairs

用于这些对的字符列表可以有不同,例如8,9,%,#等,并且只有与每种类型的开始和结束匹配的字将被剥离那些字符,并且嵌入字中的相同字符保留在其中它是。

使用Java我可以做一个模式为b8([^s]*)8b并替换为$ 1,以捕获并替换所有出现的8 ... 8,但我该如何处理所有配对的类型?

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

例如,如果匹配是9 ... 9,则替换值应该是2美元。

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

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

谢谢。


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

(?<!S)(S)(S+)1(?=s|$)

要么

(?<!S)(S)(S*)1(?=s|$)

Java正则表达式将是,

(?<!S)(S)(S+)1(?=s|$)

DEMO

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"));

输出:

This is reallly a test of repl%acing %mul%tiple matched 9pairs

说明:

  • (?<!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"));
    

    DEMO


    (?<![a-zA-Z])[8&#%9](?=[a-zA-Z])([^s]*?)(?<=[a-zA-Z])[8&#%9](?![a-zA-Z])
    

    试试这个。用$11替换。参见演示。

    https://regex101.com/r/qB0jV1/15

    (?<![a-zA-Z])[^a-zA-Z](?=[a-zA-Z])([^s]*?)(?<=[a-zA-Z])[^a-zA-Z](?![a-zA-Z])
    

    如果您有许多分隔符,请使用此选项。

    链接地址: http://www.djcxy.com/p/82937.html

    上一篇: Replace multiple capture groups using regexp with java

    下一篇: Weird behaviour with ZipArchive() adding null bytes to archive