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

时间:2011-11-24 07:09:00

标签: java regex state-machine dfa

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

2 个答案:

答案 0 :(得分:6)

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

  1. 将两个正则表达式转换为等效的NFA。这是well-known and defined process.
  2. 通过powerset construction.
  3. 将两个NFA转换为DFA
  4. 鉴于DFA的交集和互补是closed and well defined,构建两个DFA的XOR。 (这有点滥用符号,但如果automota是A和B,则构造AB'+ A'B)
  5. 此结果机器表示原始正则表达式之间的差异(一个中的任何字符串,而不是另一个中的任何字符串)。现在只需从DFA的开头到结尾运行graph reachability。如果它失败了,它们是平等的,成功,不等于!

答案 1 :(得分:0)

首先,它完全一样。其次,我无法想象做你想要的内置功能。想一想:你实际上想要将正则表达式与几个输入匹配。什么输入?随机字符串?在这种情况下,您的随机字符串仅包含数字的可能性非常规律。

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

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

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

  • 空字符串
  • 仅限字母的字符串
  • 仅限数字的字符串
  • 包含特殊字符的字符串
  • 带有unicode字符的字符串
  • 之前的混合

等等