1. ホーム
  2. javascript

[解決済み] RegExp.exec() は散発的に NULL を返す

2023-01-22 18:02:28

質問

私は真剣にこのことで気が狂いそうで、ここで何が起こっているかを理解しようとすることにすでに不釣り合いなほどの時間を費やしています。だから、私に手を貸してください =)

私はJavaScriptで文字列のいくつかのRegExpマッチングを行う必要があります。残念ながら、それは非常に奇妙な振る舞いをします。このコードです。

var rx = /(cat|dog)/gi;
var w = new Array("I have a cat and a dog too.", "There once was a dog and a cat.", "I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.");

for (var i in w) {
    var m = null;
    m = rx.exec(w[i]);
    if(m){
        document.writeln("<pre>" + i + "\nINPUT: " + w[i] + "\nMATCHES: " + m.slice(1) + "</pre>");
    }else{
        document.writeln("<pre>" + i + "\n'" + w[i] + "' FAILED.</pre>");
    }
}

最初の2つの要素に対して "cat" と "dog" を返すのは当然ですが、その後にいくつかの exec() -を返し始めます。 null . なぜなのか理解できません。

Fiddleを投稿してみました はこちら で、コードを実行して編集することができます。

で、今のところChromeとFirefoxで試しています。

どのように解決するのですか?

あ、これだ。正規表現をグローバルに定義しているため、最初にマッチするのは cat にマッチし、ループの 2 回目のパスで dog . つまり、基本的には正規表現(の内部ポインタ)もリセットする必要があるのです。参考までに。

var w = new Array("I have a cat and a dog too.", "I have a cat and a dog too.", "I have a cat and a dog too.", "I have a cat and a dog too.");

for (var i in w) {
    var rx = /(cat|dog)/gi;
    var m = null;
    m = rx.exec(w[i]);
    if(m){
        document.writeln("<p>" + i + "<br/>INPUT: " + w[i] + "<br/>MATCHES: " + w[i].length + "</p>");
    }else{
        document.writeln("<p><b>" + i + "<br/>'" + w[i] + "' FAILED.</b><br/>" + w[i].length + "</p>");
    }
    document.writeln(m);
}