6

重複の可能性:
Javascript正規表現がtrue..次にfalse..次にtrue..などを返す

まず第一に、私の悪い英語をお詫びします。

パターンに一致するように文字列をテストしようとしているので、これを書きました:

var str = 'test';
var pattern = new RegExp('te', 'gi'); // yes, I know that simple 'i' will be good for this

しかし、私はこの予期しない結果を持っています:

>>> pattern.test(str)
true
>>> pattern.test(str)
false
>>> pattern.test(str)
true

誰かがこれを説明できますか?

4

4 に答える 4

12

この動作の理由は、RegExがステートレスではないためです。あなたの2番目testは文字列内の次の一致を探し続け、それ以上見つからないと報告します。lastIndex一致するものが見つからない場合はリセットされるため、以降の検索は最初から開始されます。

var pattern = /te/gi;

pattern.test('test');
>> true
pattern.lastIndex;
>> 2

pattern.test('test');
>> false
pattern.lastIndex;
>> 0

たとえば、2つの一致がある場合、これがどのように変化するかに気付くでしょう。

var pattern = /t/gi;

pattern.test('test');
>> true
pattern.lastIndex;
>> 1

pattern.test('test');
>> true
pattern.lastIndex;
>> 4

pattern.test('test');
>> false
pattern.lastIndex;
>> 0
于 2012-04-19T13:38:21.613 に答える
2

この問題が発生したと思います:https ://bugzilla.mozilla.org/show_bug.cgi?id = 237111

gパラメータを削除すると、問題が解決します。基本的には、メソッドlastindexを実行するたびに最後の値を記憶するプロパティが原因ですtest()

于 2012-04-19T13:31:01.660 に答える
2

MDN Docs(強調鉱山)を引用するには:

文字列にパターンが見つかったかどうかを知りたい場合は、テストメソッド(String.searchメソッドと同様)を使用します。詳細(ただし実行速度が遅い)については、execメソッド(String.matchメソッドと同様)を使用してください。exec(またはそれと組み合わせて)と同様に、同じグローバル正規表現インスタンスで複数回呼び出されたテストは、前の一致を超えて進みます。

于 2012-04-19T13:36:21.253 に答える
0

これは、RegExp.test(str)メソッドの意図された動作です。lastIndex正規表現インスタンス(パターン)は、プロパティで確認できる状態を格納します。「test」を呼び出すたびに、その値が更新され、同じ引数を使用して次の呼び出しを行うと、同じ結果が得られる場合と得られない場合があります。

var str="test", pattern=new RegExp("te", "gi");
pattern.lastIndex; // => 0, since it hasn't found any matches yet.
pattern.test(str); // => true, since it matches at position "0".
pattern.lastIndex; // => 2, since the last match ended at position "1".
pattern.test(str); // => false, since there is no match after position "2".
于 2012-04-19T13:43:35.790 に答える