9

私はJavaスクリプトで次のコードを持っています

    var regexp = /\$[A-Z]+[0-9]+/g;
    for (var i = 0; i < 6; i++) {
        if (regexp.test("$A1")) {
            console.log("Matched");
        }
        else {
            console.log("Unmatched");
        }
    }

ブラウザのコンソールで実行してください。代替のMatchedUnmatchedを出力します。その理由を誰か教えてください。

4

4 に答える 4

4

test文字列を呼び出した後、lastIndexポインターは一致後に設定されます。

Before:
$A1
^

After:
$A1
   ^

最後になると、ポインタは文字列の先頭にリセットされます。

'$A1$A1' を試すことができます。結果は次のようになります。

Matched
Matched
Unmatched
...

この動作は、15.10.6.2、ECMAScript 言語仕様で定義されています。

ステップ 11. global が true の場合、R の [[Put]] 内部メソッドを引数 " lastIndex"、e、および true で呼び出します。

于 2013-01-31T03:58:35.057 に答える
1

コードを簡単な例に絞り込みました。

var re = /a/g, // global expression to test for the occurrence of 'a'
s = 'aa';     // a string with multiple 'a'

> re.test(s)
  true
> re.lastIndex
  1
> re.test(s)
  true
> re.lastIndex
  2
> re.test(s)
  false
> re.lastIndex
  0

これは、グローバル正規表現でのみ発生します!

MDN ドキュメントから.test():

同様にexec(または組み合わせて)、test同じグローバル正規表現インスタンスで複数回呼び出されると、前の一致を超えて進みます。

于 2013-01-31T04:46:24.363 に答える
0

これは、グローバル フラグを使用するためですg。 を呼び出すたびに、正規表現オブジェクト.testのプロパティが更新されます。.lastIndex

gフラグを使用しない場合は、異なる結果が表示される可能性があります。

于 2013-01-31T04:03:23.930 に答える
0

1行目の「g」は正しくありません。ここでは置換を実行していませんが、一致している場合は削除すると、期待される動作が得られます。

var regexp = /\$[AZ]+[0-9]+/g; var regexp = /\$[AZ]+[0-9]+/

于 2013-01-31T04:04:33.163 に答える