我当前正在使用此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@:%_+.~#?&/=]\/?)*)
答案 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