二月底在做模板处理时,发现常常有 RegExp 卡住的状况,之后发现有时是因为要跑很久。
在 node, firefox, IE 三大引擎上跑都一样。
例如:
'012345678901234567890123456789;'.match(/^(?:[^;]*)*$/)
用人脑计算,这式子显然匹配不出结果;但电脑似乎还没足够聪明?
前面数字多添一点,跑出结果的时间会变长许多(呈天文数字成长?)。
看来只要 pattern 写得糟一点,确实是可能让 regular expression engine 挂掉不动的。
不过同样的式子,perl 的 engine 似乎就比较聪明,马上就跑出来了。
至于其 workaround,只好放弃一次完成,采用一个个 match。
以上例而言,就是一次次 .match(/^[^;]*/),并侦测是否从头到尾都符合,直到完成。