2013-02-20 77 views
1

所以我有一个标识URL的正则表达式:为什么这个正则表达式缓慢执行?

/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/ 

但是当我用它来识别网址用户输入,只需使用.test减缓向下翻页很大,即使根据MDN,它是supposed to be faster than exec。我是否使用测试正则表达式的过时方法?有没有更快的方法,我不知道?还是我的正则表达式真的很长很复杂?

这是JSFiddle

编辑: 注意到在Chrome20.7秒,V24 1:48.5在Internet Explorer 9

+0

它使用Firefox 18为我快速执行。您使用哪种浏览器? – Vulcan 2013-02-20 05:06:51

+0

我使用的是Chrome v24。 – Polyov 2013-02-20 05:07:51

+2

'([\/\ w \ .-] *)*'< - 回溯地狱,有2层'*'。我在某处看到Firefox实现了一些限制。 – nhahtdh 2013-02-20 05:09:25

回答

0

如此看来,当它在的jsfiddle URL处理已发布信息的URL,例如正则表达式仅落后Product.aspx?Item=N82E16811139009。当这部分url被移除时,正则表达式会正确,快速地执行。

但是,从([\/\w \.-]*)*中删除最后一颗星将使正则表达式预成型不正确,因此不能使用([\/\w \.-]*)

相反,对于正则表达式能够处理与已张贴信息的网址,最后部分需要删除:

/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/ 

/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*/ 

这是因为正则表达式的设计在url结尾处检测文件类型或反斜线,而不是问号和发布的信息。删除最后一部分可以修复问题,正则表达式可以快速正确运行