关于非贪婪的正则表达式匹配的一些令人困惑的事情

时间:2012-05-10 09:54:08

标签: ruby regex

我写了一段像下面的红宝石代码

  #! /usr/bin/ruby
    s = "[[abc]]"  
    if(s =~ /\[(.+)*?\]/)
        puts $1
    end
    if(s =~ /\[(.+?)\]/)
        puts $1
    end

其输出是:

[abc
[abc

然后我改变变量s

  s = "[[abc]]]"

,其余部分保持不变,但现在结果是

[abc]
[abc

为什么会这样?谁能向我解释一下这个?

1 个答案:

答案 0 :(得分:3)

我不确定此处是否有人能够解释此行为。我检查了Regexr,正则表达式就像你期待的那样。

但是

\[(.+)*?\]

只是一个非常糟糕的设计表达。 (.+)*应该匹配什么?这就是嵌套量词,它可以在许多变体中找到有效的匹配。现在更糟糕的是,使外部量词变得懒惰,会发生什么?

如果你想使用贪婪匹配

\[(.+)\]

如果你想进行延迟匹配,请使用

\[(.+?)\]

但永远不会嵌套量词,以便他们可以找到许多可能的解决方案,这会导致catastrophic backtracking,或者在此处看到blog post by Jeff Atwood on Coding Horror about Regex Performance