在java中检查两个正则表达式是否匹配相同的字符串

在java中检查两个正则表达式是否匹配相同的字符串,java,regex,state-machine,dfa,Java,Regex,State Machine,Dfa,我有两个正则表达式(简单的例子:“[0-9]+”和“[0123456789]+”)。我想看看它们是否匹配完全相同的输入。java中是否有用于执行此检查的内置函数?如果没有,是否有一个相对简单的算法来进行检查?谢谢 首先,这是完全一样的。第二,我无法想象内置函数能满足您的需求。想一想:您实际上想要将正则表达式与几个输入进行匹配。什么投入?随机字符串?在这种情况下,随机字符串仅包含数字的可能性非常小 我可以稍微改变一下你的问题。这是我的版本 *我有两个正则表达式,希望验证它们的功能是否相同* 这个问

我有两个正则表达式(简单的例子:“[0-9]+”和“[0123456789]+”)。我想看看它们是否匹配完全相同的输入。java中是否有用于执行此检查的内置函数?如果没有,是否有一个相对简单的算法来进行检查?谢谢

首先,这是完全一样的。第二,我无法想象内置函数能满足您的需求。想一想:您实际上想要将正则表达式与几个输入进行匹配。什么投入?随机字符串?在这种情况下,随机字符串仅包含数字的可能性非常小

我可以稍微改变一下你的问题。这是我的版本

*我有两个正则表达式,希望验证它们的功能是否相同*

这个问题有道理。在本例中,我可以使用一种流行的单元测试框架(例如JUnit或TestNG)编写一系列单元测试,并对这两个正则表达式运行相同的测试。我每次都期待着同样的结果。但是我必须自己写字符串。比如说

  • 空字符串
  • 仅用字母串
  • 仅带数字的字符串
  • 带有特殊字符的字符串
  • 使用unicode字符的字符串
  • 混合以前的

etc,etc

实际上有一种算法方法来检查正则表达式的相等性,尽管它很复杂。以下是方法:

  • 将两个正则表达式转换为它们的等效NFA。这是一个
  • 通过将两个NFA转换为DFA
  • 假设交集和互补是用于DFA的,则构造两个DFA的XOR。(这有点滥用符号,但如果automota是A和B,则构造AB'+A'B)
  • 这个结果机器表示原始正则表达式之间的差异(一个正则表达式中的任何字符串,而不是另一个)。现在只需从DFA的开始运行到结束。如果失败了,他们是平等的,成功了,不是平等的
    我认为在Java中没有一种内置的方法来实现这一点。就算法而言,“最简单”(就解释而言)的方法是为每个正则表达式构造DFA,在两个正则表达式上运行DFA最小化算法,并比较结果。这实际上是一个非常重要的问题,特别是因为Java正则表达式在最严格的意义上不是“正则”的。我认为你找不到任何简单的方法来做这件事。你想检查现代的正则表达式(支持look arounds、back references等)?或者它们是“真正的”正则表达式(就像您发布的简单示例)?如果是第一个,我不认为有一个相对简单的解决方案(如果有解决方案的话!)。我不认为有一种方法可以一般地证明两个正则表达式在数学上是相同的。你甚至无法证明这些表达式会停止。尽管如此,如果你真的想要答案,你可以猜测并检查:)只要向他们抛出大量随机字符串;抛出的次数越多,两个表达式就越有可能相等。嘿,这就是我在上一篇评论(关于使用随机字符串)中所说的。除此之外,您可能应该使用类似QuickCheck的东西,而不是单元测试框架。无论如何,您应该使用QuickCheck,但我离题了。我更喜欢一种不用在输入端测试正则表达式的方法来检查正则表达式的等价性。这仅仅是因为有太多的可能输入——事实上,可能输入的数量实际上是无限的。正则表达式不像数学公式:你无法推导它们并证明它们的等价性。它们是算法,因此不太可能以同样的方式编译,除非它是像
    [:digit:][]==\d
    这样的非常琐碎的东西。