私はテストが正しいと信じています。 re.algのすべてのlibC++テストで「トーナメント」を検索し、異なるエンジンがregex("tour|to|tournament")
をどのように扱い、どのようにregex_search
がregex_match
と異なるのかを比較することは有益です。
のはregex_search
を見てみましょう:
のawk、egrepを、拡張された: "トーナメント":
regex_search("tournament", m, regex("tour|to|tournament"))
は、入力文字列全体にマッチします。
のECMAScript:
regex_search("tournament", m, regex("tour|to|tournament"))
一致した入力文字列の一部のみ: "ツアー"。
基本的なgrepを、:
regex_search("tournament", m, regex("tour|to|tournament"))
は全く一致していません。 '|'文字は特別ではありません。
awk、egrepとextendedは、可能な限り交互に一致します。ただし、ECMAScriptの変更は「順序付け」されています。これはECMA-262で指定されています。 ECMAScriptは、交替内のブランチと一致すると、検索を終了します。
/a|ab/.exec("abc")
戻り結果 "" なく、 "AB":標準は、この例を含みます。
<plug>
これはまた、Mastering Regular Expressions by Jeffrey E.F. Friedlで徹底的に議論されています。この本がないと<regex>
を実装できませんでした。そして私は、私が知っているよりも、私が正規表現について知らないことがまだまだたくさんあることを、自由に認めます。交替の章著者状態の終わりに
:
あなたは、この章では、あなたが それを読んで初めて、すべてを理解している場合、あなたはおそらく最初の場所でそれを読んでいません。
それを信じてください!
</plug>
とにかく、ECMAScriptのは、唯一の "ツアー" にマッチします。 regex_match
アルゴリズムは、の入力文字列全体がの場合にのみ成功します。入力文字列の最初の4文字のみが一致するため、awk、egrep、およびextendedとは異なり、ECMAScriptはゼロサイズのcmatch
でfalseを返します。
私のテストでは。 'c'は'(a | b)| c'と 'a |(b | c)'と一致しますが、 'a | b | c'とは一致しません。 'a'と' b'は3つとも一致します。一般に、2つ以上の式が '| 'で連結されている場合、最初の2つの式だけが動作するように見えます。私はそれがバグだと思うが、何らかの理由でこのテストを "ecma.pass.cpp"と呼ぶので、わからない。 –
[こちら](http://stackoverflow.com/questions/9764264/strange-bug-stdregex-matches-only-first-two-strings)は同じことの別のレポートです。 –
Hmm。これはバグ報告が必要だと思う。実際に正しい場合でも、テストは*なぜ*正しいのかを記録する必要があります。そして、私はそれが疑わしい。 –