2016-02-17 8 views
6

私はこの正規表現を実行しようとしていますが、それは私のコンソールを突っ込んだ。どうして?このコードがなぜnode.jsにぶつかったのですか? - Javascriptのバグ?

var str = "Шедевры православной музыки - 20 золотых православных песен"; 
str.match(/^(([\u00C0-\u1FFF\u2C00-\uD7FF]+[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]*)+) [a-z]+[^\u00C0-\u1FFF\u2C00-\uD7FF]*$/i); 
+3

スタックされたとはどういう意味ですか?あなたはコンソールにこれを入力してフリーズしますか? – Cristy

+8

'(([\ u00C0- \ u1FFF \ u2C00- \ uD7FF] + [^ az \ u00C0- \ u1FFF \)のために[致命的なバックトラッキング](https://regex101.com/r/eT6gL3/1) u2C00- \ uD7FF] *)+) 'の部分です。 [致命的なバックトラッキングに関する詳細はこちら](http://www.regular-expressions.info/catastrophic.html)。正規表現の実際の要件は何ですか? –

+1

あなたは['^([\ u00C0- \ u1FFF \ u2C00- \ uD7FF] +(?)を探していますか?[^ az \ u00C0- \ u1FFF \ u2C00- \ uD7FF] + [\ u00C0- \ u1FFF \ u2C00- \ uD7FF] +)*)[az] + [^ \ u00C0- \ u1FFF \ u2C00- \ uD7FF] * $ '](https://regex101.com/r/eT6gL3/2)? –

答えて

8

あなたの正規表現は、catastrophic backtrackinga demo of your regex hereを参照)(([\u00C0-\u1FFF\u2C00-\uD7FF]+[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]*)+)に起因する部分が発生します。 [^a-z\u00C0-\u1FFF\u2C00-\uD7FF]*は0文字と一致するため、基本的にはバックトラッキングの問題を引き起こす古典的な(a+)+のパターン(cf:([\u00C0-\u1FFF\u2C00-\uD7FF]+)+)があります。それを取り除くために

、あなたはサブパターンをグループ分け内強制であることを確認してください、そして、グループ全体へ*数量詞を適用する必要があります。

^([\u00C0-\u1FFF\u2C00-\uD7FF]+(?:[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+[\u00C0-\u1‌​FFF\u2C00-\uD7FF]+)*) [a-z]+[^\u00C0-\u1FFF\u2C00-\uD7FF]*$ 

はここregex demo

を参照してください、 [\u00C0-\u1FFF\u2C00-\uD7FF]+(?:[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+[\u00C0-\u1‌​FFF\u2C00-\uD7FF]+)*試合:

  • [\u00C0-\u1FFF\u2C00-\uD7FF]+ - 一つ以上の文字から[\u00C0-\u1FFF\u2C00-\uD7FF]範囲
  • (?:[^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+[\u00C0-\u1‌​FFF\u2C00-\uD7FF]+)* - ゼロ以上の配列:
      [^a-z\u00C0-\u1FFF\u2C00-\uD7FF]+
    • - \u00C0-\u1‌​FFF\u2C00-\uD7FF範囲からの1つの以上の文字 - a-z\u00C0-\u1FFF\u2C00-\uD7FF範囲
    • [\u00C0-\u1‌​FFF\u2C00-\uD7FF]+
    • からのもの以外の1つの以上の文字。
関連する問題