【问题标题】:How do you check if two regex's describe the same pattern?你如何检查两个正则表达式是否描述了相同的模式?
【发布时间】:2014-07-30 16:13:32
【问题描述】:

有时您可能会为一项任务想出两个不同的正则表达式。我想知道你如何检查两个正则表达式是否描述了相同的模式?

  • 是否有一些算法可以进行该检查?

  • 是否有一些(在线)工具可用于检查?

例如,我这里有两个正则表达式Can we rewrite lookbehind in terms of the if-then-else?,我想知道它们是否相同。

谢谢。

【问题讨论】:

  • 我会说谁不知道正则表达式,也不希望其他人了解它。
  • 使用 Python 你可以:看看这个stackoverflow.com/questions/21398251/…
  • @ForguesR:我有时可能需要 PCRE(PHP) 风格的正则表达式(具有 Python 风格的更多功能),但我不太了解 PHP。因此,在线工具将是最好的。
  • @ForguesR:不完全是。测试a+aaa+ 给出不同的字节码,但它们定义相同的语言(即匹配相同的字符串集)。
  • OP:这是一个非常困难的问题。对于 compsci(理论)正则表达式,stackoverflow.com/questions/560263/…math.stackexchange.com/questions/46975/… 提供一些资源。我不知道是否(甚至可以)对诸如 PCRE 之类的实际“正则表达式”做任何事情,由于它们的许多扩展,它们实际上不是正则表达式,因为它们在数学上是定义的;考虑到 PCRE 的能力,我怀疑这可能是一个 NP 完全问题。

标签: regex


【解决方案1】:

常规语言的等价性是可确定的(参见 Hopcroft、Motwani、Ullman:自动机理论、语言和计算简介,第 4.4 节),这也是最小化 DFA 的基础。直观地说,如果最小化的 DFA 是等价的(直到重命名状态),那么常规语言生成/接受的语言是相同的。所以,第一个问题的答案是肯定的。

我确定有在线工具,但在最坏的情况下,您可以要求“flex”或等效项来最小化自动机,并且您可以实现一个简单的工具,检查它们是否可以一致地重命名。

此 SO 条目也是相关的:

Regular expressions Equivalence

【讨论】:

  • OP 询问的 PCRE 是 AFAIK,不能由 DFA 表示,至少不能完全表示。例如,递归模式。
  • @amadan:OP 在询问常规语言(第一个问题),并查看答案第一段的经过仔细限定的结尾:)。我不清楚 OP(1)有多少需要这个,(2)他愿意付出多少努力,(3)他对这些问题了解多少,所以在讨论一两个弱二阶理论之前继任者或同样神秘的东西,我向他指出了相关且写得很好的文献。
  • 是的。您可能会注意到我在三个小时前在问题 cmets 中以同样的方式指出了他,所以我并不是真的不同意您的观点。我只是确保他理解真正的正则表达式和程序员所说的正则表达式之间存在巨大差异,特别是因为他明确提到了 PCRE 风格。
猜你喜欢
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
相关资源
最近更新 更多