2

我在尝试匹配最后包含图像文件扩展名的 url 时遇到了一个奇怪的问题。im 使用的正则表达式非常简单(没有 url 验证,但现在第一次迭代就可以了)。

我已经设置了一个小提琴,它应该比我用语言更好地解释它。在这里看小提琴:

http://jsfiddle.net/Vwat2/1/

笔记:

  1. 确保您在 chrome 中进行测试
  2. 确保您为 chrome 打开了任务管理器(设置图标 > 工具 > 任务管理器)
  3. 运行jsfiddle,最后没有文件扩展名匹配的正则表达式将在您将url复制到textarea后3秒触发并且没问题),3秒后带有文件扩展名匹配的正则表达式将触发,如果它影响你,文本不会更改为已触发,您将在任务管理器中看到 jsfiddle 占用 CPU

希望有人能解释这里发生了什么,我已经在 PHP 和 expresso 中运行了正则表达式,它没有任何问题,所以我不认为它卡在某种正则表达式内部循环或任何东西中。

谢谢你的帮助

编辑:这是一个精简版本,更类似于我在我的应用程序中使用它(我从第一个小提琴中删除了计时器和其他助手)。

http://jsfiddle.net/A96Mw/1/

4

2 回答 2

3

两个字:灾难性的回溯

(?:[^ ]+)+\.

是一个无用的构造 -[^ ]+\.完全匹配并且不容易回溯。

通过嵌套这两个量词,您将在不以句点结尾的字符串上获得运行时间的指数增长。一些浏览器可能会选择在几百万个循环后中止正则表达式匹配,其他浏览器(似乎是 Chrome)会继续尝试。

于 2012-07-24T13:39:09.493 回答
2

由于这个表达式,似乎是灾难性回溯(?:[^ ]+)+的情况: . 不知道为什么第一个有效,而第二个无效。

你想要的正则表达式是

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
于 2012-07-24T13:38:51.240 回答