以下是我的正则表达式:
(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你的表达花了太长时间来评估。
观察:
当查询参数的值增加到某个长度以上时,它会超时。
但是对于匹配的URL,参数值的长度并不重要。
为什么超时超时?我需要修改哪部分正则表达式?
注意:RegEx要求网址以?
或&
提前致谢。
修改
我需要的是一个验证所有标准的正则表达式(例如www.xyz.com 或someip:port后跟路径参数和/或查询参数, 等)URL。它也应该支持其他语言的字符。 通过额外的验证来强制URL以
?
或结尾&
。
答案 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 :(我用其他人的演示来测试它:)
当然这不完整,但它非常接近你想要和期望的!