使用 Java 7 和 java.util.regex.Pattern 中的默认 RegEx 实现,给出这样的正则表达式:^start (m[aei]ddel[0-9] ?)+ tail$
和这样的字符串:start maddel1 meddel2 middel3 tail
是否可以使用 anchor 定正则表达式获得这样的输出:start <match> <match> <match> tail
。
我可以让每个组都没有这样的 anchor :
正则表达式:m[aei]ddel[0-9]
StringBuffer sb = new StringBuffer();
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
matcher.appendReplacement(sb, Matcher.quoteReplacement("<middle>"));
}
问题是我正在处理一个相当大的数据集,并且能够 anchor 定模式将是一个巨大的性能胜利。
但是,当我添加 anchor 时,我能找到的唯一 API 需要完整匹配并访问组的最后一次出现。我的情况我需要验证正则表达式是否实际匹配(即整个匹配),但在替换步骤中,我需要能够自己访问每个组。
编辑我想避免像在单独的步骤中寻找 anchor 这样的解决方法,因为它需要对代码进行更大的更改并将其全部包装在 RegEx 中感觉更优雅。
最佳答案
要一步完成,您需要使用基于 \G
的正则表达式来进行 anchor 定。但是,您还需要一个积极的前瞻来检查字符串是否以所需的模式结尾。
这是一个应该有效的正则表达式:
(^start|(?!\A)\G)\s+m[aei]ddel[0-9](?=(?:\s+m[aei]ddel[0-9])*\s+tail$)
查看 regex demo
String s = "start maddel1 meddel2 middel3 tail";
String pat = "(^start|(?!\\A)\\G)\\s+(m[aei]ddel[0-9])(?=(?:\\s+m[aei]ddel[0-9])*\\s+tail$)";
System.out.println(s.replaceAll(pat, "$1 <middle>" ));
查看 Java online demo
说明 :
(^start|(?!\A)\G)
- 匹配字符串末尾的 start
或前一个成功匹配的末尾 \s+
- 1 个或多个空格 m[aei]ddel[0-9]
- m
,然后是 a
, e
, i
,然后是 ddel
,然后是 1 位 (?=(?:\s+m[aei]ddel[0-9])*\s+tail$)
- 仅当后跟:(?:\s+m[aei]ddel[0-9])*
- 零个或多个 1+ 空格序列和 middelN
模式 \s+
- 1 个或多个空格 tail$
- tails
子字符串后跟字符串的结尾。 关于java - 在java中替换重复出现的 anchor 定正则表达式组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39959878/