私はこれがどのように可能であるかについて混乱しています...
var matcher = new RegExp("d", "gi");
matcher.test(item)
上記のコードには、次の値が含まれています
item = "Douglas Enas"
matcher = /d/gi
しかし、matcher.test関数を連続して実行すると、最初の実行ではtrueになり、2回目の実行ではfalseになります。
matcher.test(item) // true
matcher.test(item) // false
次のような正規表現リテラルを使用する場合
/d/gi.test("Douglas Enas")
クロームで連続して実行すると、どちらの場合も真になります。これについての説明はありますか?
コンストラクターを使用して正規表現オブジェクトを作成するChromeコンソールでの連続実行のサンプル
matcher = new RegExp("d","gi")
/d/gi
matcher.test("Douglas Enas")
true
matcher.test("Douglas Enas")
false
matcher
/d/gi
リテラルでの連続呼び出しを使用したサンプル
/d/gi.test("Douglas Enas")
true
/d/gi.test("Douglas Enas")
true
この質問の理由は、RegExpコンストラクターと値のリストに対してテスト関数を使用すると一致が失われるためです...しかし、リテラルを使用すると、期待するすべての値が返されます
アップデート
var suggestions = [];
////process response
$.each(responseData, function (i, val)
{
suggestions.push(val.desc);
});
var arr = $.grep(suggestions, function(item) {
var matcher = new RegExp("d", "gi");
return matcher.test(item);
});
クロージャー内でマッチャーの作成を移動すると、欠落した結果が含まれていました。「d」は実際には動的に作成された文字列ですが、簡単にするために「d」を使用しました。提案配列を反復処理しているときにテストを実行するたびに新しい式を作成するかどうかはまだわかりませんが、結果が誤って除外されることはまだ少し混乱しています。おそらく、一致テストの進歩と関係があります。