1

例:

a = "abcab"

/c??ab/.match(a) # Matches "ab", as I expected
/c?ab/.match(a)  # Still matches "ab"

私が理解しているように、文字?だけが貪欲であるため、最初に可能な限り最大の文字列 - cab - と一致させようとする必要がありますが、これは Ruby 1.9 で得られる動作ではありません。

予想される動作とその理由は何ですか?

4

1 に答える 1

1

正規表現は全体として積極的です — それは可能な限り最初の場所で一致しようとします. したがってc?ab、 とc??abは同等です。唯一の違いは、一致させることを好む部分文字列の長さであり、実際にはその設定を実行する機会がありません。


これを少し拡張します。. . このことを考慮:

/<.*>/.match("abcde<fghi>jkl<mn>o")

最初に からマッチングを開始し、<貪欲なので、マッチングしながら可能な限りマッチングしようとする、つまり にマッチングし<fghi>jkl<mn>ます。貪欲でない量指定子に変更した場合:

/<.*?>/.match("abcde<fghi>jkl<mn>o")

最初の からマッチングを開始しますが、<マッチング中は可能な限りマッチングを行わないようにします。つまり、 のみにマッチングし<fghi>ます。<mn>しかし、それがより短い部分文字列であっても、スキップしてそれに一致しようとはしません。それが一致する唯一の方法<mn>は、以前のどこにも完全に一致しなかった場合です。

于 2013-07-15T01:06:39.933 に答える