私はこれらの結果を観察します:
// Test 1:
var re = /a|ab/;
"ab".match(re); // returns ["a"] <--- Unexpected
// Test 2:
re = /ab|a/;
"ab".match(re); // returns ["ab"]
「左端最長」の原則により、テスト 1 と 2 の両方が ["ab"] を返すと予想します。正規表現の 2 つの選択肢の順序によって結果が変わる理由がわかりません。
私はこれらの結果を観察します:
// Test 1:
var re = /a|ab/;
"ab".match(re); // returns ["a"] <--- Unexpected
// Test 2:
re = /ab|a/;
"ab".match(re); // returns ["ab"]
「左端最長」の原則により、テスト 1 と 2 の両方が ["ab"] を返すと予想します。正規表現の 2 つの選択肢の順序によって結果が変わる理由がわかりません。
以下の理由を見つけてください。
一致が見つかるまで、代替は左から右と見なされることに注意してください。左の選択肢が一致する場合、たとえ「より良い」一致が生成されたとしても、右の選択肢は無視されます。したがって、パターン /a|ab/ を文字列「ab」に適用すると、最初の文字のみに一致します。
(ソース: Oreilly - Javascript Pocket Reference - Chapter 9 正規表現)
ありがとう。
これは、JavaScript が POSIX エンジンを実装していないためです。
POSIX NFA エンジンは、1 つの例外を除いて、従来の NFA と同様に機能します。POSIX エンジンは、常に最も左端の一致から最も長いものを選択します。たとえば、代替
cat|category
は、最初の代替 (「cat」) が一致して代替の前に出現した場合でも、可能な限り完全な単語「category」と一致します。(MRE 153-154 を参照)
出典: Oreilly - Javascript Pocket Reference, p.4