【问题标题】:Do all regular expressions halt?所有的正则表达式都停止了吗?
【发布时间】:2010-11-17 11:50:04
【问题描述】:

是否有任何正则表达式可以为某些输入字符串永远搜索匹配项?

【问题讨论】:

  • ...你能写一个程序来确定一个正则表达式是否会因给定的输入而停止吗?
  • 对于加分 - 使用正则表达式!
  • 当然,mmyers 和 mgb - 只需针对连接到正则表达式的输入运行它:/.*/ - 匹配意味着它停止,不匹配意味着它没有。 :P
  • mmyers:这个程序很简单。我将在 python 中呈现它:True。 --- 至于 accepting 一个字符串,嗯,那就是“在输入 i 上运行 regex r,返回它返回的内容。”

标签: regex halting-problem


【解决方案1】:

对于有限输入,没有正式的正则表达式不会停止。

任何正式的正则表达式都可以转换为确定性有限自动机。 DFA 一次读取一个字符,在输入结束时,您要么处于接受状态,要么处于不接受状态。如果状态为接受,则输入匹配正则表达式。否则,它不会。

现在,大多数“正则表达式”库都支持非正则表达式的内容,例如反向引用。只要您远离这些功能,并且输入有限,就可以保证停止。如果您不...取决于您使用的确切内容,您可能无法保证停止。例如,Perl 允许插入任意代码,并且不保证与图灵机等效的任意代码停止。

现在,如果输入是无限的,那么可以找到永远不会停止的普通正则表达式。例如,“.*”。

【讨论】:

  • 唯一的狡辩:它们被称为确定性有限自动机,而不是确定的。与(具有讽刺意味的是,等效的)非确定性有限自动机对比。
  • @Agor:当我这样做时,我讨厌它。我很清楚正确的名称,但由于某些原因,我总是输入错误的名称。 :-(
【解决方案2】:

正式的正则表达式实际上是一种描述用于解析字符串的确定性有限自动机的方法。如果 DFA 在输入结束时处于接受状态,则正则表达式“匹配”。由于 DFA 是按顺序读取其输入的,所以当它到达输入的末尾时它总是会停止,而是否存在匹配只是检查它停止在 DFA 的哪个状态的问题。

子字符串匹配实际上是相同的,除了不是在字符串的一次通读结束时强制停止,而是在读取每个可能的子字符串一次后强制停止 DFA - 仍然是有限的情况。 (是的,大多数正则表达式引擎以更优化的方式实现这一点,而不是仅仅将所有可能的子字符串都扔到 DFA 上——但从概念上讲,限制仍然存在)。

因此,DFA 不会停止的唯一可能情况是输入是无限的,这通常被认为超出了停止问题的范围。

【讨论】:

    【解决方案3】:

    我想,不可能找到一个不会停止的正则表达式。

    输入的大小是有限的。正则表达式的任何匹配子组的最大大小是输入的最大大小。

    除非使用的算法非常愚蠢(多次检查案例),否则匹配子组的数量也是有限的。

    所以,它会停止。

    【讨论】:

      【解决方案4】:

      根据this question,每个正则表达式都会停止。

      【讨论】:

        【解决方案5】:

        不是您所描述的意思,您可能有一些非常低效的正则表达式,它们占用大量资源并最终杀死正则表达式引擎,这与停止不同。

        我认为暂停在这里并不适用,正如这篇文章的其他评论者如此敏锐地指出的那样。 http://en.wikipedia.org/wiki/Halting_problem

        【讨论】:

        • 没有办法制作一个程序,对于每个可能的程序都会告诉你它是否停止。但这并不意味着您不能对子集执行此操作。也许正则表达式就是这样一个子集,但我不知道。
        • 这里提到的停机问题不是很有用;用于 RE 匹配的算法是一种特殊的算法,关于停止问题的有趣之处在于解决所有程序输入对的问题。
        • 是的,这就是我在回答中想说的。
        【解决方案6】:

        我无法想象一个输入字符串会被永远解析,尽管无限长的字符串会被永远解析。鉴于正则表达式可以描述正则语言,这可能是无限的单词集,那么正则表达式可以描述无限单词的语言,包括无限长的单词。但是,没有输入字符串可以无限长,所以在某些时候它必须停止。

        例如,如果 a*b 在语言中被接受,并且你有一个无限长的 'a's 字符串,那么是的,正则表达式永远不会停止。但实际上,这是不可能的。

        【讨论】:

          【解决方案7】:

          是的。

          正则表达式可以用有限状态机表示。每次收到原子输入时,都会导致任何定义明确的 FSM 转换到已知状态。

          当您有无限输入时例外,但这不适用于停止问题,因为它处理有限输入。当你有一个有限状态机和有限输入时,总是可以确定你的机器是否会停止。

          http://en.wikipedia.org/wiki/Finite_state_machine

          【讨论】:

            【解决方案8】:

            Daniel 的回答 +1:所有有限输入都会导致真正的正则表达式(即没有反向引用或其他非正则表达式功能)停止,并且正则表达式相当于 DFA。

            奖励:正则表达式匹配可以简单快速 (但在 Java、Perl、PHP、Python、Ruby 中速度很慢……)

            http://swtch.com/~rsc/regexp/regexp1.html

            注意文章顶部的两张图在y轴上有不同的刻度:一个是秒,另一个是微秒

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-10-29
              • 1970-01-01
              • 1970-01-01
              • 2010-12-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多