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

Regex 是否存在可以确定一种常规语言是否与另一种常规语言匹配的任何输入匹配的算法?,regex,computer-science,theory,Regex,Computer Science,Theory,假设我们有正则表达式: 你好,W.*rld 你好,世界 *世界 *W* 我希望尽量减少匹配任意输入所需的正则表达式的数量 为此,我需要找到一个正则表达式是否与另一个表达式匹配的任何输入匹配。可能吗 比利3是的 两种正则语言的等价性问题是可判定的 算法示意图: 最小化两个DFA 检查它们是否同构 当然可以!。正则表达式可以表示为FSM(有限状态机),从技术上讲,可以识别相同字符串的FSM数量是无限的 同构是描述两个FSM是否相等的名称。有几种算法可以最小化FSM。例如,可以在n状态自动机上最

假设我们有正则表达式:

  • 你好,W.*rld
  • 你好,世界
  • *世界
  • *W*
我希望尽量减少匹配任意输入所需的正则表达式的数量

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

比利3是的

两种正则语言的等价性问题是可判定的

算法示意图:

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

    • 当然可以!。正则表达式可以表示为FSM(有限状态机),从技术上讲,可以识别相同字符串的FSM数量是无限的


      同构是描述两个FSM是否相等的名称。有几种算法可以最小化FSM。例如,可以在n状态自动机上最小化O(n log n)中的两个FSM。

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

      为了对这一问题进行一次很好的调查,并找到一种有趣的方法,我推荐了来自arXiv的论文

      稍后编辑:如果您对正则表达式的包含而不是等价感兴趣,我会遇到一篇可能感兴趣的论文:-我只浏览了一下,但它似乎包含了一个解决该问题的多项式时间算法。

      这个问题称为正则表达式的“包含”或“包含”,因为您需要的是,由一个正则表达式匹配的单词集是否包括(或包含)由另一个正则表达式匹配的单词集。相等是一个不同的问题,通常意味着两个正则表达式是否匹配完全相同的单词,即它们在功能上是等价的。例如,“a*”包括“aa*”,但它们并不相等

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

      输入r1和r2 如果r1包括r2,则输出是

    • 创建DFA(r1)和DFA(r2)
    • 创建Neg(DFA(r1))(与r1不匹配的单词完全匹配)
    • 创建Neg(DFA(r1))x DFA(r2)(与Neg(DFA(r1))和DFA(r2)匹配的单词完全匹配)
    • 检查自动机是否在3中制造。与任何单词都不匹配

    • 这是可行的,因为您要检查的是,没有与r2匹配的单词与r1不匹配

      @skaffman:我认为正则语言标签是合适的,因为正则表达式描述的是一种正则语言——它只是“在纸上”表示它的一种简单方式。但是w.r.t.计算机科学的问题更多的是关于正则语言而不是正则表达式。呃,标题与描述不匹配?我不确定是否符合“算法”,但使用“.*”将任意输入与一个正则表达式匹配;我怀疑它是否可以最小化到小于1.:-)@杰瑞:嗯,这些只是例子:)在实际案例中,它们更复杂@maxschlepzig:我稍微修改了描述。图同构在多项式时间内是不可解的,所以我看不出这有什么帮助。@Billy:我想你的答案是,这是一个理论上可解的问题,不太实际。@szbalint:嗯,“理论上”我可以把每一个可能的输入字符串放到这些语言中,看看它们是否匹配相同的东西。如果它不能在合理的消费硬件上解决,那就没什么意义了。@Billy ONeal:图形同构和它有什么关系?而且不要抨击理论上的cs。可判定的结果具有实际意义。例如,两种上下文无关语言的等价性问题是不可判定的。我不是在“抨击理论上的CS”--但我认为从我的问题中可以明显看出,证明这个问题仅仅是可判定的并不是一个答案的全部用处。@Dani:maxschlepzig的答案也有同样的问题。同构在NP类中。@Billy ONeal:首先,(图)同构在NP类中(这是真的),但被认为不是NP完全的,虽然不在P类中。然而,我们谈论的是DFA同构,这是一个完全不同的东西。@Billy:DFA同构在类中P@BillyDFA同构更简单。你只有一个开始point@BillyONeal:基本上,DFA和图形之间最大的区别在于DFA是有标签的,因此您知道首先要匹配什么(初始/终端状态,具有相同字母的边)。此外,还有一些DFA是同构的(我们讨论的是从一个状态开始的后缀等价定义的同构,还有其他可能的同构定义),但它们的图形表示不是.Hmmm。。有趣。一个问题是,
      *
      Hello World
      显然是不等价的,尽管
      *
      可以匹配任何
      Hello World
      可以匹配的东西。我不确定“匹配”对你的意义——似乎你不想测试等价性,而是想测试包含性。你能更准确地回答你的问题吗?我的困难是,我不知道如何准确地描述我要找的东西——很抱歉,我在这里绕了这么远。我已经稍微修改了这个问题——从维基百科对集合论的描述来看,包含似乎正是我所需要的。@Billy:我想我刚才添加的链接文章就是你要找的。@Billy ONeal:如果你对近似值(你可能是这样)满意,这个答案中的最后一篇文章可能对你有好处。