3

私はこれらの結果を観察します:

// 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 つの選択肢の順序によって結果が変わる理由がわかりません。

4

2 に答える 2

3

以下の理由を見つけてください。

一致が見つかるまで、代替は左から右と見なされることに注意してください。左の選択肢が一致する場合、たとえ「より良い」一致が生成されたとしても、右の選択肢は無視されます。したがって、パターン /a|ab/ を文字列「ab」に適用すると、最初の文字のみに一致します。

(ソース: Oreilly - Javascript Pocket Reference - Chapter 9 正規表現)

ありがとう。

于 2013-11-11T16:59:30.870 に答える
2

これは、JavaScript が POSIX エンジンを実装していないためです。

POSIX NFA エンジンは、1 つの例外を除いて、従来の NFA と同様に機能します。POSIX エンジンは、常に最も左端の一致から最も長いものを選択します。たとえば、代替cat|categoryは、最初の代替 (「cat」) が一致して代替の前に出現した場合でも、可能な限り完全な単語「category」と一致します。(MRE 153-154 を参照)

出典: Oreilly - Javascript Pocket Reference, p.4

于 2013-11-11T17:06:57.750 に答える