JavaScript URL正则表达式拆分

JavaScript URL正则表达式拆分,javascript,regex,Javascript,Regex,我有一个能够检测URL的正则表达式(披露:我从互联网上复制了这个正则表达式) 我的目标是分割一个字符串,以便得到一个子字符串数组,这些子字符串要么是完整的URL,要么不是 比如说 const detectUrls = // some magical Regex const input = 'Here is a URL: https://google.com <- That was the URL to Google.'; console.log(input.split(detectUrl

我有一个能够检测URL的正则表达式(披露:我从互联网上复制了这个正则表达式)

我的目标是分割一个字符串,以便得到一个子字符串数组,这些子字符串要么是完整的URL,要么不是

比如说

const detectUrls = // some magical Regex
const input = 'Here is a URL: https://google.com <- That was the URL to Google.';

console.log(input.split(detectUrls)); // This should output ['Here is a URL: ', 'https://google.com', ' <- That was the URL to Google.']
有人能给我指出正确的方向吗?提前感谢。

试试这个:

var detectUrls = /(([a-z]+:\/\/)?(([a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(:[0-9]{1,5})?(\/[a-z0-9_\-.~]+)*(\/([a-z0-9_\-.]*)(\?[a-z0-9+_\-.%=&amp;]*)?)?(#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(\s+|$)/gi;

var input = "Here is a URL: https://google.com";

alert(input.match(detectUrls));

工作小提琴:

获得多个匹配项的原因是正则表达式将为每个组返回一个匹配项(括号内的内容)。
对于想要的结果,您应该使用非捕获组
(?:myRegex)

我修改了您的正则表达式,以便它可以工作:

/((?:[a-z]+:\/\/)?(?:(?:[a-z0-9\-]+\.)+(?:[a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(?::[0-9]{1,5})?(?:\/[a-z0-9_\-.~]+)*(?:\/(?:[a-z0-9_\-.]*)(?:\?[a-z0-9+_\-.%=&amp;]*)?)?(?:#[a-zA-Z0-9!$&'(?:)*+.=-_~:@/?]*)?)(?:\s+|$)/
提示:使用类似于测试正则表达式的在线网站。
这个问题的答案也有帮助:

在regex
(…)
中称为捕获组。结果数组中每个捕获组有一个项。解决方案将命名为捕获组,但浏览器支持可能不好()。与其编写自己的解决方案,为什么不重新使用现有的解决方案呢?()它只是匹配模式,OP想要一个使用URL拆分字符串的数组。感谢您的回答和链接到我可以学习的其他资源。你的回答解决了我的问题!
/((?:[a-z]+:\/\/)?(?:(?:[a-z0-9\-]+\.)+(?:[a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(?::[0-9]{1,5})?(?:\/[a-z0-9_\-.~]+)*(?:\/(?:[a-z0-9_\-.]*)(?:\?[a-z0-9+_\-.%=&amp;]*)?)?(?:#[a-zA-Z0-9!$&'(?:)*+.=-_~:@/?]*)?)(?:\s+|$)/