使用IE和Chrome匹配正则表达式时,javascript会挂起

Jac*_*eng 3 javascript regex internet-explorer google-chrome

当我"\w+([\.\-]?\w+)*@" 尝试测试它是否匹配字符串时,我得到了一个有问题的正则表达式

"ffffffffffb3ffffffffffafffffffffffabffffffffffc2ffffffffffa7e"
Run Code Online (Sandbox Code Playgroud)

它会导致IE和Chrome挂起.但FF工作得很好.

我发现了"?" 在正则表达式是没有必要的.它删除了"?"后找到它.

但这是我不明白导致问题的原因.这是一些测试

  1. "\w+([\.\-]?\w+)*" 工作良好.

  2. "\w+([\.\-]\w+)*@" 工作良好.

  3. "\w+([\.\-]?\w+)*@" 导致问题

谁知道为什么?或者它只是浏览器之间的性能.

Tim*_*ker 5

这被称为灾难性的回溯.

在你的第三个例子中,@(显然导致正则表达式失败)强制你的正则表达式引擎尝试所有可能的排列\w+(\w+)*(因为字符类是可选的).使用这个长度的字符串,计算将花费更长的时间,直到宇宙的热量死亡.

RegexBuddy截图

Firefox似乎对正则表达式有一个迭代限制,并且在大约一百万次尝试后将中止,Chrome和IE似乎在这里更加坚忍.