这是一个正则表达式BUG吗?

时间:2016-08-01 08:38:49

标签: javascript ios regex

var url = 'https://mp.weixin.qq.com/s?__biz=MzAxNjczMTQxMA==&mid=504131096&idx=1&sn=c2fe41152807821b7916fa9539a0cf87&scene=1&srcid=0718JR98ETFngTl6mDsNRfhK&key=77421cf58af4a65374324bd2f16d7fdd913230b5ab4bd48a72759cc99919893795265ff20c0c8a79c676e636f789899c&ascene=0&uin=MjAzOTExMTUxMg%3D%3D&devicetype=iMac15%2C1+OSX+OSX+10.11.5+build(15F34)&version=11020201&pass_ticket=kA76WNrCKCEZ3JyEii3tYs88BCmLEM%2FI4LPD%2FtHBzoPjYzI9t7seUadtUUVQ9677';
var reg = /^(http(s)?:\/\/)?(([\w\.]+)\.(?:com|cn|love|net|com\.cn|org)(\/|#|!|%|\w|\d|&|\?|-|=|~|\.|\+)*)$/;
url.match(reg);

我想测试字符串是否有验证URL,但是匹配语句会将进程引导到CRASH! - 浏览器或iOS App,之后不会响应,CPU一直是90%+,可能是无限循环? 我的注册错了还是这是正则表达式的BUG?

我在JavaScript(http://regexr.com/),节点和iOS中测试过,它们返回超时或没有响应(崩溃)。

1 个答案:

答案 0 :(得分:4)

问题是最后一个交替组有几个在字符串中相同位置匹配的分支(即\w\d),以及该组上的*量词集在匹配失败之前,回溯工作很难尝试所有可能的组合。

您需要使用[\/#!%\w&?\-=~.+]字符类:

/^(http(s)?:\/\/)?(([\w.]+)\.(?:com|cn|love|net|com\.cn|org)[\/#!%\w&?\-=~.+]*)$/

请参阅regex demo

注意我将-转义为字符类,以便在将来更新模式时不会破坏正则表达式(-可以放在结尾或开头正则表达式模式表示一个文字连字符,但是一些开发人员倾向于在符号类的末尾添加符号,有时会在不知道的情况下使用-创建一个范围。