为什么Regexp有超时方法,而理论上却不应该?

时间:2019-08-30 18:45:04

标签: regex regular-language computation-theory dfa

这是理论上的计算机科学问题(计算理论)。

我知道RegExps可能需要很长时间才能计算出来。但是,根据计算理论,我们知道可以在几个时钟周期内非常快地完成与正则表达式的匹配。

如果RegExps等效于有限自动机,为什么RegExps具有(或要求)超时方法? 使用DFA,匹配的计算时间可以非常快。

用RegExps表示正则表达式模式匹配主要语言的类; JavaScript,C#等

常见的RegExps(“ regex”)是否不等同于自动机理论中的正则表达式(即正则语言)?

有关示例,请参见:How do I timeout Regex operations to prevent hanging in .NET 4.5?Regex Pattern Catastrophic backtracking

如果Regexp的匹配需要回溯,则意味着它们不等于正则表达式。

如果“ Regexp”捕获的语言不是常规语言,从历史上讲,为什么(出于某种必要)对其进行了扩展?

如果得出的DFA是否需要大量的状态集?

3 个答案:

答案 0 :(得分:0)

因为正则表达式不等同于自动机理论中的正则表达式。

它们更像是具有额外功能的表亲,这使它们更加复杂,有时(取决于正则表达式)无法在长字符串上执行。

答案 1 :(得分:0)

一个很好的理由是catastrophic backtracking,这解释了为什么某些正则表达式的匹配不会在heat death of the universe之前返回。

答案 2 :(得分:-1)

  

(出于什么必要)被扩展了?

在缺少正则表达式功能的系统上扩展了正则表达式的实现,这些系统需要一些困难的解决方法,例如,用一种缺乏表现力的编程语言编写大量代码。该代码还存在很大的风险,即该代码可能正确,高效且能可靠地防止误报匹配。