为什么默认情况下正则表达式贪婪?

Yis*_*hai 31 regex language-design regex-greedy

对于初学者编写正则表达式来说,这似乎是一个巨大的混乱源,可能会导致隐藏的性能问题,并且看起来典型的用例将是非贪婪的.

这只是出于遗留原因(它是如何首次完成的,每个实现都复制了),还是有原因的?

Dig*_*oss 11

歇斯底里的Raisens


部分答案可能涉及RE在实际计算中的起源.它们最初是来自自动机理论和形式语言理论理论概念,直到Ken Thompson自己编写了一个真实的实现并在qeded中使用它们(1).

原始版本只有贪婪的语法,所以甚至没有决定.

  • 我不太确定你可以说理论上的常规语言默认是贪婪的.我认为Kleene正则表达式定义了一组可以匹配它的所有字符串,因此`/ x*/`可以匹配""或"x"或"xxx"(等等).这样的表达式定义了包括字符串"","x"和"xxx"的常规语言.请注意,这没有说明如何在文本正文中搜索匹配项; 只有当你运用这个理论时才开始关心贪婪. (3认同)

And*_*y E 8

在性能方面,由于回溯,懒惰量词并不总是更快:http://blog.stevenlevithan.com/archives/greedy-lazy-performance

至于实际的设计,我老实说不能说为什么量词在默认情况下是贪婪的,但我确实想知道什么样的控制字符会被用来使量词贪婪而不是懒惰.我认为?不会削减它:-)

  • 确实如此.它似乎是最好的贪婪符号. (8认同)
  • 显然这将是$ (4认同)
  • @forefinger:不匹配字符串/行的结尾? (2认同)