2013-08-01 12 views
5

私のアプリで問題をデバッグしようとしていますが、これはChromeをチョークする正規表現を含む特定の状況に絞ってあります。 Firefoxで同じコードを試しても問題ありません。また、正規表現を実行するために私の 'サンプル'テキストを減らす場合もそれが動作します。なぜこのコードはChromeのチョークを引き起こしますか?

だから何ですか? http://jsfiddle.net/XWKRb/1/ (私はとあなたは同じ結果を得ている場合クロームチョークしまうので、全くの初期化に失敗している)

私はjsfiddleに入れているコードです:

ここ

はjsfiddleがあります

var rgx = /^(\d+([,|;]?\d*))*$/; 
var sample = '40162690,40162755,40162691,40168355,40168357,40162726,40162752,40162729,40428707 ,40162740,40162546'; 
alert("Test is "+rgx.test(sample)); 

問題を回避するために私の正規表現を書く方が良いでしょうか?目標は、コンマまたはセミコロンで区切られた数字の文字列を正規表現で捕捉することです。

+0

は意図的なsample' 'でそのスペースですか?RegexBuddyであなたの正規表現をテストすると、次のことを示し、これを説明するために

+1

これはWindows 7の64ビット版Google Chrome v28を破棄したことを確認できます –

+0

このバグは、サンプル文字列内にスペースがある場合にのみ表示されるようです。 –

答えて

13

あなたはcatastrophic backtrackingの古典的なケースを持っている:

^(\d+([,|;]?\d*))*$ 
    ^ ^^^
    |  | | ---- zero or more repetitions of the group 
    |  | ------- zero or more digits 
    |  ---------- zero or one comma, pipe or semicolon 
    ----------------- one or more digits 

は自分自身を繰り返し、そのうちの一つのオプション要素を含み、繰り返しグループが含まれています。今のセパレータを無視して、あなたの正規表現は、最悪の場合にチェックしなければならない順列の指数関数的な数につながる基本的に正規表現

^(\d+\d*)*$ 

を持っています。

あなたの文字列の中に許可されている文字以外の文字(例のスペースのようなもの)が見つかると、正規表現は失敗するはずですが、これを理解するためにはエンジンの年齢が必要です。一部のブラウザではこのような暴走した正規表現の一致を検出しますが、Chromeはこれを乗り切りたいと考えています。

Input    Steps to determine a non-match 
1,1X     23 
12,21X    119 
123,321X    723 
1234,4321X   4,743 
12345,54321X  31,991 
123456,654321X 217,995 
1234567,7654321X attempt aborted after 1,000,000 steps 
+0

繰り返しグループには、オプションでない要素「\ d +」が含まれています。 –

+0

@ LightnessRacesinOrbit:そうです。しかし、問題はまだ同じです。 –

+1

この問題の説明に感謝します! – Trant

4

このパターンは良い仕事します:

var rgx = /^\d+(?:[,;]\s*\d+)*$/; 
+0

それは空の文字列を受け入れません..元で重要だったかどうかは分かりません – Esailija

+0

うん、この正規表現は同じ無限ループを引き起こさずに仕事をします - ありがとう! – Trant

+0

@Trant:これは無限ループとは異なり、むしろ試しすぎる可能性があります。 –

関連する問題