Ruby 关于非贪婪正则表达式匹配的一些困惑
我写了一段ruby代码,如下所示Ruby 关于非贪婪正则表达式匹配的一些困惑,ruby,regex,Ruby,Regex,我写了一段ruby代码,如下所示 #! /usr/bin/ruby s = "[[abc]]" if(s =~ /\[(.+)*?\]/) puts $1 end if(s =~ /\[(.+?)\]/) puts $1 end 其产出是: [abc [abc 然后我改变变量s s = "[[abc]]]" 其余部分保持不变,但现在结果是 [abc] [abc 为什么会发生这种情况?有人能给我解释一下吗?
#! /usr/bin/ruby
s = "[[abc]]"
if(s =~ /\[(.+)*?\]/)
puts $1
end
if(s =~ /\[(.+?)\]/)
puts $1
end
其产出是:
[abc
[abc
然后我改变变量s
s = "[[abc]]]"
其余部分保持不变,但现在结果是
[abc]
[abc
为什么会发生这种情况?有人能给我解释一下吗?我不确定这里是否有人能解释这种行为。我在那里检查了一下,正则表达式的行为就像你期待的那样 但是 这只是一个非常糟糕的设计表达。
(.+)*
应该匹配什么?这是嵌套量词,它可以在许多变体中找到有效匹配。更糟糕的是,让外部量词变懒,会发生什么
如果你想有贪婪的匹配使用
\[(.+)\]
如果要进行惰性匹配,请使用
\[(.+?)\]
但千万不要嵌套量词,这样他们就可以找到许多可能的解决方案,这导致了,或者在这里看到一个我认为这可能与+?和*?这两个非贪婪量词?我从未使用过ruby,但您的正则表达式不是非贪婪的。
+
最终仍然是贪婪的。@npinti那么为什么在案例2中它与[abc]不匹配,就像在贪婪案例中一样?
\[(.+?)\]