JavaScript RegEx与斜杠不匹配

时间:2019-11-10 16:19:00

标签: javascript regex url

我当前正在使用此RegEx来匹配字符串中的每个链接:

let regex = /\b(https?:\/\/)?(([a-z\d]+([-_][a-z\d]+)*)\.)+\w{2,32}(:[\d]{2,5})?([-a-z0-9@:%_+.~#?&/=]*)\b/gi;

这些链接匹配没有问题,这是有意的。

https://gle.co.ulk.co.com:443/?key=test&5345@%20#arr/do
https://google.coshe
google.comls
google.co

这些链接也将匹配,但最后的/(斜线)不包括在匹配中,这不是故意的:

https://gle.co.ulk.co.com:443/?key=test&5345@%20#arr/do/
https://google.coshe/
google.comls/
google.co/

我尝试使用这些匹配组代替([-a-zA-Z0-9@:%_+.~#?&/=]*),但没有成功:

([-a-zA-Z0-9@:%_+.~#?&/=]*)\/?
([-a-zA-Z0-9@:%_+.~#?&/=]*\/?)
(([-a-zA-Z0-9@:%_+.~#?&/=]\/?)*)

1 个答案:

答案 0 :(得分:2)

使用边界条件可能会对url造成问题。
其中包括\b

轻松进行网址匹配的方法是使用更具体的形式
在域部分,最后是广义的目录/参数结构。

这很轻松,没有边界说明:

/((?:https?:\/\/)?(?:(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?)/gi

https://regex101.com/r/UxcFCO/1


这可以通过空白边界规范放松:
该网址在组1中。

/(?:^|\s)((?:https?:\/\/)?(?:(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?)/gi

https://regex101.com/r/NpqgXX/1