我正在尝试匹配文本字符串中的URL,并且正在使用此正则表达式搜索URL:
/\b(https?:\/\/.*?\.[a-z]{2,4}\b)/g
问题是,它只匹配协议和域,而没有其他匹配项。
示例:
let regEx = /\b(https?:\/\/.*?\.[a-z]{2,4}\b)/g;
let str = 'some text https://website.com/sH6Sd2x some more text';
console.log(str.match(regEx));
返回:
https://website.com
我将如何更改正则表达式,使其返回完整的URL?
https://website.com/sH6Sd2x
工作演示:
let regEx = /\b(https?:\/\/.*?\.[a-z]{2,4}\b)/g;
let str = 'some text https://website.com/sH6Sd2x some more text';
console.log(str.match(regEx));
答案 0 :(得分:0)
它在那里停止的原因是您的表达式以\.[a-z]{2,4}
结尾,我猜这是为了匹配顶级域(.com
,.net
,uk
等) 。之后,它将停止匹配。
解决方案:将\/[^\s]*
添加到表达式中。这会匹配一个斜杠和零个或多个非空白字符。
请注意,\S
(大写字母S)与[^\s]
(小写字母s)等效,因此请使用最喜欢的。
演示:
let regEx = /\b(https?:\/\/.*?\.[a-z]{2,4}\/[^\s]*\b)/g;
let str = 'some text https://website.com/sH6Sd2x some more text';
console.log(str.match(regEx));
如果您意识到URL永远不会包含空格,并且不需要显式匹配域,甚至可以进一步缩短它,或者更糟的是,它甚至可能引起麻烦(例如.museum
也是有效的TLD,但您要排除在外)它)。
增强版本(正则表达式更短,更准确):
let regEx = /\b(https?:\/\/\S*\b)/g;
let str = 'some text https://website.com/sH6Sd2x some more text';
console.log(str.match(regEx));
答案 1 :(得分:-1)
由于正则表达式以\.[a-z]{2,4}\b
结尾,因此它仅与URL中主机名的顶级域部分匹配。之后,您需要匹配其余URL。这将匹配之后的所有非空白字符:
let regEx = /\bhttps?:\/\/.*?\.[a-z]{2,4}\b\S*/g;
有关匹配网址的更完整解决方案,请参见Detect URLs in text with JavaScript。