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



所以我有一个正则表达式来标识URL:

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

但是,当我使用它来识别用户输入的URL时,简单地使用.test会大大减慢页面速度,尽管根据MDN,它应该比exec更快。我是否使用了一种过时的测试正则表达式的方法?有没有我不知道的更快的方法?或者我的正则表达式真的很长很复杂?

这是一个JSFiddle。

编辑:Chrome 24版需要20.7秒Internet Explorer 9 中的1:48.5

因此,regex似乎只在处理已发布信息的url时滞后,例如在jsfiddle url Product.aspx?Item=N82E16811139009中。当url的这一部分被删除时,regex将正确、快速地预成型。

但是,从([/w .-]*)*中删除最后一个星号会导致正则表达式预型不正确,因此不能选择使用([/w .-]*)

相反,为了让regex能够处理带有发布信息的url,最后一部分需要删除:

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

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

这是因为regex的设计目的是检测url末尾的文件类型或反斜杠,而不是问号和发布的信息。删除最后一部分可以修复问题,regex可以快速正确运行

最新更新