为什么正则表达式需要花费太长时间来评估某些值?

时间:2014-06-23 10:25:35

标签: javascript regex regex-negation regex-lookarounds

以下是我的正则表达式:

(https?:\/\/)([a-zA-Z]{2,6}\.)*((?!.*[|!{}[\]^"*;]).)+(\.*)([a-zA-Z0-9\.\-\/\:\?&=_%#]+)+([&|?])+$

验证具有否定预测的URL以允许来自其他语言的字符。

当我在http://regex101.com/#javascript测试时会发生这种情况:

For -

  

http://server.com/path?id=1111111 - 没有比赛

     

http://server.com/path?id=11111111 - TIMEOUT你的表达花了太长时间来评估。

     

http://server.com/path?id=111111111111111111111& - MATCH

观察:

当查询参数的值增加到某个长度以上时,它会超时。

但是对于匹配的URL,参数值的长度并不重要。

为什么超时超时?我需要修改哪部分正则表达式?

注意:RegEx要求网址以?&

结尾

提前致谢。

修改

  

我需要的是一个验证所有标准的正则表达式(例如www.xyz.com   或someip:port后跟路径参数和/或查询参数,   等)URL。它也应该支持其他语言的字符。   通过额外的验证来强制URL以?或结尾   &

2 个答案:

答案 0 :(得分:2)

(…+)+中的([a-zA-Z0-9\.\-\/\:\?&=_%#]+)+会导致catastrophic backtracking。删除其中一个优点应该会有所帮助。

答案 1 :(得分:1)

这是我能想到的最好的:

\b([\d\w\.\/\+\-\?\:]*)((ht|f)tp(s|)\:\/\/|[\d\d\d|\d\d]\.[\d\d\d|\d\d]\.|www\.|\.tv|\.ac|\.com|\.edu|\.gov|\.int|\.mil|\.net|\.org|\.biz|\.info|\.name|\.pro|\.museum|\.co)([\d\w\.\/\%\+\-\=\&\?\:\\\"\'\,\|\~\;]*)\b

JSFiddle :(我用其他人的演示来测试它:)

http://jsfiddle.net/3AE9p/

当然这不完整,但它非常接近你想要和期望的!