作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
使用 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
\G
断言位置在前一个匹配的末尾或第一个匹配的字符串的开头。
关于java - 在java中替换重复出现的锚定正则表达式组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39959878/
我是一名优秀的程序员,十分优秀!