用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|$)
匹配后面必须跟一个空格或行尾的结尾。 对于这个特定的情况,你可以修改上面的正则表达式,
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])
试试这个。用$1
或1
替换。参见演示。
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