8

私はこれがどのように可能であるかについて混乱しています...

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」を使用しました。提案配列を反復処理しているときにテストを実行するたびに新しい式を作成するかどうかはまだわかりませんが、結果が誤って除外されることはまだ少し混乱しています。おそらく、一致テストの進歩と関係があります。

4

3 に答える 3

10

からRegExp.test():

test同じグローバル正規表現インスタンスで複数回呼び出されると、前の一致を超えて進みます。

したがって、基本的に のインスタンスがある場合、RegExpへの呼び出しごとtestにマッチャーが進められます。最初のものを見つけると、それを超えて別のdものを見つけようとします。まあ、もう何もないので、 を返します。 dfalse

一方、次の場合:

/d/gi.test("Douglas Enas") 

RegExpその場で毎回新しいインスタンスを作成するので、常に最初にそれを見つけますd(したがって、 を返しtrueます)。

于 2012-11-21T19:25:30.557 に答える
0

I can't find the link ATM, but as I recall, this is a known issue with the test method in combination with a g pattern: the match position isn't "forgotten" somehow. Either drop the global flag and/or use the .match method, and it'll work just fine.

于 2012-11-21T19:29:41.447 に答える
0

Mozilla Developer Network によると、

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

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/test

于 2012-11-21T19:26:36.390 に答える