二月底在做模板處理時,發現常常有 RegExp 卡住的狀況,之後發現有時是因為要跑很久。
在 node, firefox, IE 三大引擎上跑都一樣。
例如:
'012345678901234567890123456789;'.match(/^(?:[^;]*)*$/)
用人腦計算,這式子顯然匹配不出結果;但電腦似乎還沒足夠聰明?
前面數字多添一點,跑出結果的時間會變長許多(呈天文數字成長?)。
看來只要 pattern 寫得糟一點,確實是可能讓 regular expression engine 掛掉不動的。
不過同樣的式子,perl 的 engine 似乎就比較聰明,馬上就跑出來了。
至於其 workaround,只好放棄一次完成,採用一個個 match。
以上例而言,就是一次次 .match(/^[^;]*/),並偵測是否從頭到尾都符合,直到完成。