2

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

4

2 回答 2

6

实际上有一种算法方法可以检查正则表达式是否相等,尽管它很复杂。就是这样:

  1. 将两个正则表达式转换为等效的 NFA。这是一个众所周知的定义过程。
  2. 通过powerset 构造将两个 NFA 转换为 DFA 。
  3. 鉴于 DFA 的交集和互补是封闭的并且定义明确,请构建两个 DFA 的 XOR。(这有点滥用符号,但如果自动机是 A 和 B,则构造 AB'+A'B)
  4. 这个结果机器代表了原始正则表达式之间的差异(一个中的任何字符串,但不是另一个)。现在只需从 DFA 的开始到结束运行图可达性。如果失败,他们是平等的,成功时,不平等!
于 2013-06-11T00:47:41.173 回答
0

首先,它完全一样。其次,我无法想象内置功能可以满足您的需求。想一想:您实际上希望将正则表达式与多个输入进行匹配。什么输入?随机字符串?在这种情况下,您的随机字符串仅包含数字的机会是非常规律的。

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

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

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

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

等等等等

于 2011-11-24T07:19:06.907 回答