貪欲で怠惰な正規表現(理解力の質問)

貪欲で怠惰な正規表現(理解力の質問)

私は正規表現を自分で教えていますが、「貪欲な」対「怠惰な」葉に閉じ込められています。

これまで私が見つけたのは

  • 「Greedy」は、正規表現ができるだけ多くの一致を探すことを意味します。
  • »lazy«は、正規表現ができるだけ少ない数の一致を見つけることを意味します。

私が見つけたほとんどの記事は、a)私が使い続けているプログラミング言語で使用するか、b)アクティベーションの使用を扱っていますが、grepPerlegrepについてgrep -PPerl Mode知識がないので、それは私にとってあまり役に立ちません。

私の理解の問題:私はこの大きなハンマー方式を使うようになりました。

  • 怠惰な反復は、可能な限り短い一致を探します。
  • 結果が長すぎる場合→リピーターの音量を下げてください?
  • 結果がまだ長すぎる場合は→他の解決策を見つけてください。

これは、HTMLコードの例と実験によって得られた結果ですが、圧倒的ではない結果を得ました。

私の要約にいくつかの重要なことがないかどうか、どこにいるのか教えてくれてありがとう。

ベストアンサー1

最も短いゲームではなく、単に短いゲームです。貪欲モードは可能な最後の一致を見つけようとし、怠惰なモードは最初の可能な一致を見つけようとします。しかし、可能な最初の一致は必ずしも最短ではありません。

入力文字列foobarbazと正規表現o.*a(欲求)またはo.*?a(怠惰)を取得します。

この入力文字列の可能な最短一致はですoba

しかし、正規表現は左から右に一致する項目を探すので、o最初の項目を探します。残りのパターンが一致する場合、そのパターンはそのまま残ります。ofoobarbaz

最初のo.*greedy)はobarbaz(文字列全体)を食べてから、残りのパターン(a)と一致するように逆追跡します。だから最後のaを探してbaz最終的に一致しますoobarba

最初の項目の後、o文字.*?列全体を(ゆっくりと)食べるのではなく、残りのパターンが最初に表示される項目を探します。したがって、最初にo一致しない2番目のものを見てから、一致しないものを見てから、一致するものを見て怠惰なので、停止aします。 (と判明したがそうではない)baaaoobaoba

だから、最も短いバージョンではありませんが、貪欲なバージョンよりも短いです。

おすすめ記事