12

このコードが最初にtrueを返し、次にfalseを返すのはなぜですか

var pattern = new RegExp("mstea", 'gi'), name = "Amanda Olmstead";

console.log('1', pattern.test(name));
console.log('1', pattern.test(name));

デモ:フィドル

4

4 に答える 4

9

g検索を繰り返すためのものです。正規表現オブジェクトをイテレータに変更します。このtest関数を使用して文字列がパターンに従って有効であることを確認する場合は、次の修飾子を削除してください。

var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";

このtest関数は、反復全体を消費しないreplacematch、消費しないため、「悪い」状態になります。関数を使用するときは、おそらくこの修飾子を使用しないでくださいtest

于 2013-03-25T08:14:19.987 に答える
7

あなたはpattern.testと組み合わせてgiを使いたくありません。gフラグは、実行している場所を追跡して再利用できることを意味します。したがって、代わりに次を使用する必要があります。

var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";

console.log('1', pattern.test(name));
console.log('1', pattern.test(name));

また、次のように、正規表現に/.../[flags]構文を使用できます。

var pattern = /mstea/i;
于 2013-03-25T08:15:27.057 に答える
3

g修飾子を設定したためです。

あなたの場合のためにそれを取り除いてください。

var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";
于 2013-03-25T08:15:17.837 に答える
3

バグではありません。

これにより、最初の一致の後に、サブストリングgに対して次に試行された一致が実行されます。そしてそれが、すべての試みでfalseを返す理由です。

First attempt: 
It is testing "Amanda Olmstead"

Second attempt:
It is testing "d" //match found in previous attempt (performs substring there)

Third attempt:
It is testing "Amanda Olmstead" again //no match found in previous attempt

... so on

Regexp.exec州のMDNページ:

正規表現で「g」フラグを使用している場合は、execメソッドを複数回使用して、同じ文字列内の連続する一致を見つけることができます。これを行うと、正規表現のlastIndexプロパティで指定されたstrのサブストリングから検索が開始されます。

test州のMDNページ:

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

于 2013-03-25T08:16:31.967 に答える