使用 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 ,然后是 aei ,然后是 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/

    10-10 02:55