JS RegEx用于匹配完整的URL

时间:2018-11-25 21:01:29

标签: javascript regex match

我正在尝试匹配文本字符串中的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));

2 个答案:

答案 0 :(得分:0)

它在那里停止的原因是您的表达式以\.[a-z]{2,4}结尾,我猜这是为了匹配顶级域(.com.netuk等) 。之后,它将停止匹配。

解决方案:将\/[^\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