我正在编写 Java 代码,它必须区分具有多个可能匹配项的正则表达式与只有一个可能匹配项的正则表达式。
例如:
“美国广播公司”。可以有多个匹配项(“abc1”、abcf、...), 而“abcd”只能匹配“abcd”。
现在我最好的想法是寻找所有未转义的正则表达式特殊字符。
我相信在 Java 中有更好的方法来做到这一点。想法?
(后期添加):
为了让事情更清楚 - 没有特定的输入来测试。这个问题的一个好的解决方案将必须测试正则表达式本身。
换句话说,我需要一个签名可能看起来像这样的方法:
boolean isSingleResult(String regex)
如果仅针对一个 可能的字符串 s1,此方法应返回 true。表达式 s1.matches(regex) 将返回 true。 (见上面的例子。)
最佳答案
这听起来很脏,但可能值得看看 Pattern class in the Java source code .
快速浏览一下,它似乎对给定的正则表达式(第 1441 行)进行了“规范化 ()”,这可以将表达式变成更可预测的东西。我认为反射可以用来挖掘类(class)的一些私有(private)资源(谨慎使用!)。有可能在对正则表达式模式进行标记时,如果它已达到模式中的某种“多重匹配”元素,则会有特定的指示。
更新
仔细查看后,包范围内有一些数据,您可以使用这些数据来利用模式分词器的工作来遍历正则表达式的节点并检查多字符节点。
编译正则表达式后,遍历从 Pattern.root 开始的已编译“节点”。从类的第 3034 行开始,有广义的节点类型。例如class Pattern.All 是多重匹配,而Pattern.SingleI 或Pattern.SliceI 是单匹配,等等。
所有这些 token 类似乎都在包范围内,因此应该可以在不使用反射的情况下执行此操作,而是创建一个 java.util.regex.PatternHelper 类来完成这项工作。
希望这对您有所帮助。
关于java - 我怎么知道正则表达式是否有多个可能的匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1913985/