例:
a = "abcab"
/c??ab/.match(a) # Matches "ab", as I expected
/c?ab/.match(a) # Still matches "ab"
私が理解しているように、文字?
だけが貪欲であるため、最初に可能な限り最大の文字列 - cab - と一致させようとする必要がありますが、これは Ruby 1.9 で得られる動作ではありません。
予想される動作とその理由は何ですか?
正規表現は全体として積極的です — それは可能な限り最初の場所で一致しようとします. したがってc?ab
、 とc??ab
は同等です。唯一の違いは、一致させることを好む部分文字列の長さであり、実際にはその設定を実行する機会がありません。
これを少し拡張します。. . このことを考慮:
/<.*>/.match("abcde<fghi>jkl<mn>o")
最初に からマッチングを開始し、<
貪欲なので、マッチングしながら可能な限りマッチングしようとする、つまり にマッチングし<fghi>jkl<mn>
ます。貪欲でない量指定子に変更した場合:
/<.*?>/.match("abcde<fghi>jkl<mn>o")
最初の からマッチングを開始しますが、<
マッチング中は可能な限りマッチングを行わないようにします。つまり、 のみにマッチングし<fghi>
ます。<mn>
しかし、それがより短い部分文字列であっても、スキップしてそれに一致しようとはしません。それが一致する唯一の方法<mn>
は、以前のどこにも完全に一致しなかった場合です。