

こんにちは、いつもお世話になっています。

javascriptで正規表現を使うプログラムを書いているのですが、プログラムが動かなくなってしまいます。

試してみたところ、以下のコードで同じ状況が発生しました。

[code]

    let regex = /(\w+(,|\s)*)+;/;
    let text = "XXXX,XXXX,XXX,XXX,XXXX,XXX,XXXX,XXX,XXX,XXX,XXXX, XXXXX";
    
    // ここでフリーズ
    let matched = text.match(regex);
    
    console.log(matched[0]);
    
[/code]

このコードの場合、textはセミコロンで終わっていないため、一致するものがなくmatchedがnullになると思ったのですが、プログラムの実行が完了しません。

何故このようなことになるのか、教えて頂けないでしょうか？

よろしくお願い致します。


CC BY-SA 4.0
2020-05-30T05:00:52.280
67135
2020-05-30T07:28:57.287
35844
question
javascript node.js 正規表現
以下のような正規表現でmatchを使うと、プログラムの実行が終わりません


**組み合わせ爆発** が起っているのでしょう。

[code]

    regex = /(\w+(,|\s)*)+;/
    
[/code]

で `;` の有無で `null` になるはずということですが、regex 表現の最後尾にあるため、コンピューターは、その前の
`(\w+(,|\s)*)+` の部分のパターンを作ってから最後に `;`
を付けたパータンを考え、そこで初めて与えられた文字列にマッチするかしないかを、律儀に全パターンを作って試して行きます。

特に、`(,|\s)*` で単語区切りがあってもなくてもどちらでもいいような表現になってしまっているのも組み合わせ爆発の一因だと思います。`(,|\s)+`
とすれば、必ず `XXXX,` 毎に部分的マッチが確定します。なので、自分なら、こうしますかね：

[code]

    let regex = /(\w+(,|\s)+)+(\w+);/;
    
[/code]

[ideone](https://ideone.com/HrFOLM) で試した分には、null で無事終了しました。


CC BY-SA 4.0
2020-05-30T07:28:57.287
67141
2020-05-30T07:28:57.287
7290
67135
answer