我有这个要求 - 对于输入字符串,如下所示
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,%,#etc,并且只有与每种类型匹配开头和结尾的单词将被剥离这些字符,并且在单词中保留相同的字符它是.
使用Java我可以做一个模式\\b8([^\\s]*)8\\b和替换为$ 1,以捕获和替换所有出现的8 ... 8,但是我如何对所有类型的对进行此操作?
我可以提供一个类似\\b8([^\\s]*)8\\b|\\b9([^\\s]*)9\\b..等等的模式来匹配所有类型的匹配对*8,9,..),但是如何指定'变量'替换组 -
例如,如果比赛是9 ... 9,则替换应为2美元.
我当然可以通过其中的多个来运行它,每个都替换一个特定类型的对,但我想知道是否有更优雅的方式.
还是有一种完全不同的方法来解决这个问题?
谢谢.
您可以使用下面的正则表达式,然后将匹配的字符替换为组索引 2 中存在的字符。
(?<!\S)(\S)(\S+)\1(?=\s|$)
或者
(?<!\S)(\S)(\S*)\1(?=\s|$)
Java正则表达式是,
(?<!\\S)(\\S)(\\S+)\\1(?=\\s|$)
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"));
| 归档时间: | 
 | 
| 查看次数: | 1580 次 | 
| 最近记录: |