为什么regex需要很长时间来计算某个值

Why does regex take too long to evaluate for certain value?

本文关键字:计算 长时间 regex 为什么      更新时间:2023-09-26

下面是我的正则表达式:

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

它是用来验证一个URL的负前瞻性,以允许来自其他语言的字符。

下面是我在http://regex101.com/#javascript:

测试时的结果

For -

http://server.com/path?id=1111111 - NO MATCH

http://server.com/path?id=11111111 - TIMEOUT表达式计算时间过长。

http://server.com/path?id=111111111111111111111&——匹配

观察

:

当查询参数的值超过一定长度时,将超时。

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

为什么超过一定长度会超时?我需要修改正则表达式的哪一部分?

注意:RegEx要求URL以?&结尾

提前感谢。

编辑:

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

([a-zA-Z0-9'.'-'/':'?&=_%#]+)+中的(…+)+导致灾难性的回溯。去掉一个加号应该会有帮助。

这是我能想到的最好的:

'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/

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