4

JS の RegExp オブジェクトで奇妙な動作が見られます。検索オートコンプリート機能の単語の先頭に対してクエリ文字列を一致させようとしています。名前の配列を反復処理して一致を返す間、正規表現は他のすべての予想される一致にのみヒットします。

var words = [
                "catherine",
                "caterpillar", 
                "nice catch", 
                "fat cat", 
                "catalina"
            ],
            re = new RegExp('\\bcat', 'gi'),
            matches = [],
            results, i;

for (i=0; i<words.length; i++) {
    if (re.exec(words[i])) {
        matches.push(words[i]);
    }
}

console.log(matches);

このコードは を返します["catherine", "nice catch", "catalina"]。要素の順序に関係なく、動作は同じです。この RegExp オブジェクトを反復ごとに (たとえばre = new RegExp('\\bcat', 'gi')for ループ内で) 再作成すると、期待どおりに機能し、すべての配列項目が返されますが、実際にはそうではありません。パスごとにそれを行う必要があります。

私は正規表現にあまり詳しくありません - これは私の正規表現の問題ですか? 区切り文字か何かを忘れましたか?それとも、もう 1 つの JS の癖ですか?

4

2 に答える 2

7

execRegExpオブジェクトを呼び出すlastIndexと、正規表現が文字列と一致した以前のインデックスを含むプロパティが維持されます。次にそれを使用して一致させようとすると、別の文字列で検索している場合でも、execインデックスの検索のみが開始されます。lastIndex + 1

これを防ぐには、ループの各反復でに設定re.lastIndexする-1か、RegExpの作成時にグローバルフラグを削除するだけです。

于 2012-08-21T18:23:01.393 に答える