为什么这个正则表达式执行缓慢?

时间:2013-02-20 05:02:10

标签: javascript regex

所以我有一个识别网址的正则表达式:

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

但是,当我使用它来识别用户输入的网址时,只需使用.test大幅减慢网页速度,即使根据MDN,也是supposed to be faster than exec。我使用过时的正则表达式测试方法吗?有一种我不知道的更快的方法吗?或者我的正则表达真的很长很复杂?

这是JSFiddle

编辑: Chrome,v24需要20.7秒 Internet Explorer 9中的1:48.5

1 个答案:

答案 0 :(得分:0)

因此,似乎正则表达式只会在处理已发布信息的网址时滞后,例如在jsfiddle网址Product.aspx?Item=N82E16811139009中。当网址的这一部分被删除时,正则表达式会正确且快速地预先形成。

但是,删除([\/\w \.-]*)*中的最后一个星标会导致正则表达式预编码错误,因此无法使用([\/\w \.-]*)

相反,为了使正则表达式能够处理包含已发布信息的URL,最后一部分需要删除:

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

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

这是因为正则表达式旨在检测网址末尾的文件类型或反斜杠,而不是问号和发布的信息。删除最后一部分可以解决问题,正则表达式可以快速正确运行