このコードが最初にtrueを返し、次にfalseを返すのはなぜですか
var pattern = new RegExp("mstea", 'gi'), name = "Amanda Olmstead";
console.log('1', pattern.test(name));
console.log('1', pattern.test(name));
デモ:フィドル
このコードが最初にtrueを返し、次にfalseを返すのはなぜですか
var pattern = new RegExp("mstea", 'gi'), name = "Amanda Olmstead";
console.log('1', pattern.test(name));
console.log('1', pattern.test(name));
デモ:フィドル
g
検索を繰り返すためのものです。正規表現オブジェクトをイテレータに変更します。このtest
関数を使用して文字列がパターンに従って有効であることを確認する場合は、次の修飾子を削除してください。
var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";
このtest
関数は、反復全体を消費しないreplace
かmatch
、消費しないため、「悪い」状態になります。関数を使用するときは、おそらくこの修飾子を使用しないでくださいtest
。
あなたは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;
g
修飾子を設定したためです。
あなたの場合のためにそれを取り除いてください。
var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";
バグではありません。
これにより、最初の一致の後に、サブストリング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(またはそれと組み合わせて)と同様に、同じグローバル正規表現インスタンスで複数回呼び出されたテストは、前の一致を超えて進みます。