10

いくつかの Rails コード (cucumber 機能のステップ定義、javascript、rails_admingem) で、次の正規表現部分を見つけました。

string =~ /some regexp.+rules should match "(.*?)"/i

私は正規表現についてある程度の知識があり、*?記号が似ていることは知っていますが、アスタリスクは を意味zero and moreし、疑問符は を意味しcould be present or could be notます。

したがって、記号のグループの近くで疑問符を使用すると、テスト対象のフレーズ内でその存在が不要になります。何が...まあ...不要なすでにグループの近くでそれを使用するトリックですか(スキップ要件は、アスタリスクafaikを使用して行われます)?

4

4 に答える 4

14

*量指定子 ( など)の直後で?は、 は別の意味を持ち、「貪欲でない」ものになります。そのため、デフォルトでは*可能な限り消費しますが、*?一致は可能な限り少なくします。

あなたの特定のケースでは、これは次のような文字列に関連しています。

some regexp rules should match "some string" or "another"

疑問符がない場合、正規表現は文字列全体に一致し (他のものと同じように.*使用できるため)、キャプチャされます。クエスチョン マークを使用すると、マッチはできるだけ早く (つまり の後) 停止し、 のみをキャプチャします。"some string" or "another...some string"some string

参考文献。

于 2012-11-15T16:09:54.140 に答える
6

?二重の意味があります。

/foo?/

最後oは0回または1回存在できることを意味します。

/foo*?/ 

最後oがゼロまたは何度も存在することを意味しますが、最小数を選択します。つまり、貪欲ではありません。

これらは説明に役立つかもしれません:

'foo'[/foo?/]   # => "foo"
'fo'[/foo?/]    # => "fo"
'fo'[/foo*?/]   # => "fo"
'foo'[/foo*?/]  # => "fo"
'fooo'[/foo*?/] # => "fo"

non-greedy使用?は残念だと思います。彼らは、私たちが「ゼロまたは1」を意味する単一の意味を持つと予想した演算子を再利用し、解読するのが非常に難しい方法でそれを私たちに投げました。

しかし、その必要性は本物でした。正規表現エンジンが予期しない文字パターンで言ったことを実行していたため、非常に多くの場合、非常に間違ったパターンを記述し、すべてを見えなくしていました。正規表現は非常に複雑で複雑になる可能性がありますが、「貪欲でない」使用はそれを抑えるのに?役立ちます。時々、それを使用することは、ずさんな、または素早い汚い方法ですが、それを正しく行うためにパターンを書き直す時間がありません。時にはそれは魔法の弾丸であり、エレガントでした。締め切りが迫っていて、何かを成し遂げるためのコードを書いているのか、それとも何年も後にデバッグしていて、最終的にそれ?が最適な修正ではないことがわかったのかによって、どちらになるかはわかります。

于 2012-11-15T16:11:33.043 に答える
5

検索を非貪欲にします。つまり、最長ではなく、可能な限り最短の一致で解決します。

于 2012-11-15T16:09:47.870 に答える
3

この文字列を検討してください

"<person>1</person><person>2</person>"

正規表現

<person>.*</person>一致します<person>1</person><person>2</person>

だから、貪欲.*です..

正規表現

<person>.*?</person>一致<person>1</person><person>2</person>、次の一致で

だから、怠け者.*?です..

于 2012-11-15T16:13:43.410 に答える