簡體   English   中英

為什么此代碼會導致Chrome窒息?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM