【发布时间】:2012-12-03 03:32:09
【问题描述】:
tl;dr 有没有办法在 Java 中将任意正则表达式或/组合成一个正则表达式(用于匹配,而不是捕获)?
在我的应用程序中,我收到了来自用户的两个列表:
- 正则表达式列表
- 字符串列表
我需要输出 (2) 中与 (1) 中的任何正则表达式都不匹配的字符串列表。
我有明显的幼稚实现(迭代(2)中的所有字符串;对于每个字符串迭代(1)中的所有模式;如果没有模式匹配,则将字符串添加到将返回的列表中)但是我想知道是否可以将所有模式组合成一个模式并让正则表达式编译器利用优化机会。
OR-组合正则表达式的明显方法显然是(regex1)|(regex2)|(regex3)|...|(regexN),但考虑到我无法控制单个正则表达式,我很确定这不是正确的做法(例如,它们可以包含所有方式的 back/前向参考)。因此,我想知道您是否可以提出一种在 java 中组合任意正则表达式的更好方法。
注意:这只是上面的暗示,但我会明确表示:我只匹配字符串 - 我不需要使用捕获组的输出。
【问题讨论】:
-
一个正则表达式是只匹配部分字符串还是匹配整个字符串?
-
@Tomalak 应该允许用户提供的正则表达式匹配 (2) 中的部分字符串 - 特别是在天真的实现中,我使用
Matcher.find()来查看是否至少有一个匹配项 -
您认为
regex1|regex2|regex3产生错误结果的原因是什么?你能构建一个它会的情况吗? -
我明白了。是的,有了反向引用,你就永远不走运了。不能组合自引用表达式。
-
@Tomalak 一些引擎提供
(?|...|...|...),其中每个替代方案的组从1开始计算......但不幸的是,我认为Java 没有
标签: java regex optimization