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で確認したところ、正規表現は期待どおりに動作します。

しかし

\[(.+)*?\]

ひどく悪い設計表現です。何を(.+)*合わせる必要がありますか?これは量指定子の入れ子であり、多くのバリエーションで有効な一致を見つけることができます。さらに悪いことに、外側の量指定子を遅延させると、どうなるでしょうか?

欲張りなマッチングをしたいなら

\[(.+)\]

遅延マッチングが必要な場合は、使用します

\[(.+?)\]

ただし、量指定子を入れ子にしないでください。多くの可能な解決策を見つけることができます。これにより、壊滅的なバックトラッキングが発生します。または、Regex Performance に関する Coding Horror に関する Jeff Atwoodのブログ投稿を参照してください。

于 2012-05-10T10:36:32.833 に答える