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

Why does this regex execute slowly?

本文关键字:执行 缓慢 正则表达式 为什么      更新时间:2023-09-26

所以我有一个正则表达式来标识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可以快速正确运行