是否存在可以确定一种常规语言是否与另一种常规语言匹配的任何输入匹配的算法?

时间:2010-09-02 18:48:49

标签: regex computer-science theory

假设我们有正则表达式:

  • Hello W. * rld
  • Hello World
  • 。* World
  • 。* W。*

我想最小化匹配任意输入所需的正则表达式的数量。

为此,我需要查找一个正则表达式是否与另一个表达式匹配的任何输入匹配。这可能吗?

Billy3

4 个答案:

答案 0 :(得分:11)

任何正则表达式都可以链接到DFA - 您可以最小化DFA,并且由于最小形式是唯一的,因此您可以决定两个表达式是否相同。 Dani Cricco指出了Hopcroft O(n log n)算法。 Hopcroft和Craft还有另一种改进算法,用于测试O(n)中两个DFA的等价性。

关于这个问题的一个很好的调查和一个有趣的方法,我推荐了arXiv的论文Testing the Equivalence of Regular Languages

后期编辑:如果你对正则表达式的包含而不是等价感兴趣,我会遇到一篇可能感兴趣的论文:Inclusion Problem for Regular Expressions - 我只是略过它但它似乎包含一个多项式问题的时间算法。

答案 1 :(得分:2)

两种常规语言的等同性问题是可判定的。

算法草图:

  • 最小化两个DFA
  • 检查它们是否是isomorph

答案 2 :(得分:2)

不确定!正则表达式可以表示为FSM(有限状态机),并且技术上无限数量的FSM可以识别相同的字符串。

Isomorphism是描述两个FSM是否等效的名称。有一些算法可以最小化FSM。例如,Hopcroft minimization algorithm可以在n状态自动机上最小化O(n log n)中的两个FSM。

答案 3 :(得分:0)

这个问题被称为"包含"或者"包含"正则表达式,因为你要求的是一个正则表达式匹配的单词集是否包括(或包含)由另一个正则表达式匹配的单词集。平等是一个不同的问题,通常意味着两个正则表达式是否匹配完全相同的单词,即它们在功能上是等同的。例如" a *"包括" aa *",虽然它们不相等。

所有已知的regexp包含算法都是regexp大小的最坏情况需要时间指数。但标准算法是这样的:

输入r1和r2 如果r1包含r2

,则输出Yes
  1. 创建DFA(r1)和DFA(r2)
  2. 创建Neg(DFA(r1))(与r1不匹配的单词匹配)
  3. 创建Neg(DFA(r1))x DFA(r2)(与Neg(DFA(r1)) DFA(r2)匹配的单词完全匹配)
  4. 检查3.中的自动机是否与任何单词匹配
  5. 这是有效的,因为您正在检查的是r2没有与r1不匹配的单词匹配。