gpt4 book ai didi

java - 在java中替换重复出现的锚定正则表达式组

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:22:35 26 4
gpt4 key购买 nike

使用 Java 7 和 java.util.regex.Pattern 中的默认 RegEx 实现,给定如下正则表达式:

^start (m[aei]ddel[0-9] ?)+ tail$

还有这样的字符串:

start maddel1 meddel2 middel3 tail

是否可以使用锚定的正则表达式获得这样的输出:

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 时,我能找到的唯一 API 需要完整匹配并访问该组的最后一次出现。我的情况是我需要验证正则表达式是否真正匹配(即完整匹配),但在替换步骤中我需要能够单独访问每个组。

编辑我想避免像在单独的步骤中寻找 anchor 这样的解决方法,因为这需要对代码进行更大的更改并将其全部包装在 RegExes 中感觉更优雅。

最佳答案

您可以为此使用 \G:

final String regex = "(^start |(?<!^)\\G)m[aei]ddel[0-9] (?=.* tail$)";
final String str = "start maddel1 meddel2 middel3 tail";

String repl = str.replaceAll(regex, "$1<match> ");
//=> start <match> <match> <match> tail

RegEx Demo

\G 断言位置在前一个匹配的末尾或第一个匹配的字符串的开头。

关于java - 在java中替换重复出现的锚定正则表达式组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39959878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com