我写了一段像下面的红宝石代码
#! /usr/bin/ruby
s = "[[abc]]"
if(s =~ /\[(.+)*?\]/)
puts $1
end
if(s =~ /\[(.+?)\]/)
puts $1
end
其输出是:
[abc
[abc
然后我改变变量s
s = "[[abc]]]"
,其余部分保持不变,但现在结果是
[abc]
[abc
为什么会这样?谁能向我解释一下这个?
答案 0 :(得分:3)
我不确定此处是否有人能够解释此行为。我检查了Regexr,正则表达式就像你期待的那样。
但是
\[(.+)*?\]
只是一个非常糟糕的设计表达。 (.+)*
应该匹配什么?这就是嵌套量词,它可以在许多变体中找到有效的匹配。现在更糟糕的是,使外部量词变得懒惰,会发生什么?
如果你想使用贪婪匹配
\[(.+)\]
如果你想进行延迟匹配,请使用
\[(.+?)\]
但永远不会嵌套量词,以便他们可以找到许多可能的解决方案,这会导致catastrophic backtracking,或者在此处看到blog post by Jeff Atwood on Coding Horror about Regex Performance