[英]Why does this code cause Chrome to choke?
我正在嘗試調試我的應用程序中的問題,我已經縮小到涉及正則表達式的特定情況,導致Chrome窒息! 在Firefox中嘗試相同的代碼可以正常工作。 此外,如果我減少我的'樣本'文本以運行正則表達式也可以。
什么給出了什么?
這是jsfiddle: http : //jsfiddle.net/XWKRb/1/ (這將無法初始化,因為如果你獲得與我相同的結果,Chrome會窒息)
我在jsfiddle中輸入的代碼是:
var rgx = /^(\d+([,|;]?\d*))*$/;
var sample = '40162690,40162755,40162691,40168355,40168357,40162726,40162752,40162729,40428707 ,40162740,40162546';
alert("Test is "+rgx.test(sample));
也許有更好的方法來編寫我的正則表達式來避免這個問題? 目標是正則表達式應該捕獲由逗號或分號分隔的一串數字。
你有一個典型的災難性回溯案例:
^(\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似乎想要將其解決。
為了說明這一點,在RegexBuddy中測試你的正則表達式顯示如下:
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
這種模式會更好:
var rgx = /^\d+(?:[,;]\s*\d+)*$/;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.