1

我写了一段 ruby​​ 代码,如下所示

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

它的输出是:

[abc
[abc

然后我改变变量 s

  s = "[[abc]]]"

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

[abc]
[abc

为什么会发生这种情况?有人可以向我解释一下吗?

4

1 回答 1

3

我不确定这里是否有人能够解释这种行为。我检查了Regexr并且正则表达式的行为就像你所期望的那样。

\[(.+)*?\]

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

如果你想有贪婪匹配使用

\[(.+)\]

如果你想有惰性匹配,使用

\[(.+?)\]

但是永远不要嵌套量词,这样他们就可以找到许多可能的解决方案,这会导致灾难性的回溯,或者在此处查看Jeff Atwood 关于编码恐怖的关于正则表达式性能的博客文章

于 2012-05-10T10:36:32.833 回答