我在尝试匹配包含图像文件扩展名的网址时遇到了一个奇怪的问题。正则表达式使用非常简单(没有url验证,但现在第一次迭代会做。)
我已经设置了一个小提琴,应该用语言来解释它。请看这里的小提琴:
注意:
希望有人可以解释这里发生了什么,我在PHP和expresso中运行正则表达式并且它没有任何问题所以我不认为它卡在某种正则表达式内部循环或任何东西。
感谢您的帮助
编辑:这是一个精简的版本,更类似于我在我的应用程序中使用它(我已经从第一个小提琴中删除了计时器和其他助手)。
答案 0 :(得分:3)
两个字:Catastrophic backtracking:
(?:[^ ]+)+\.
是一个无用的构造 - [^ ]+\.
完全相同,不容易回溯。
通过嵌套两个量词,您将在一段时间内不会结束的字符串上获得指数级的运行时增长。有些浏览器可能会选择在几百万次循环后中止正则表达式匹配,其他浏览器(如Chrome似乎)会继续尝试。
答案 1 :(得分:2)
因为这个表达式(?:[^ ]+)+
,似乎是Catastrophic Backtracking的情况。不知道为什么第一个有效,而第二个没有。
你想要的正则表达是
url = new RegExp("https?://(?:[^ ]+)\\.", "i")
// or
url = /https?:\/\/(?:[^ ]+)+\./i
和
imgurl = new RegExp("https?://(?:[^ ]+)\\.(?:jpe?g|gif|png)", "i")
// or
imgurl = /https?:\/\/(?:[^ ]+)+\.(?:jpe?g|gif|png)/i