我有以下正则表达式
var URL_REGEX = /(^|[\s\n]|<br\/?>)((?:(?:https?|ftp):\/\/)?[\-A-Z0-9\u00A0-\uD7FF\uE000-\uFDCF\uFDF0-\uFFFD+\u0026\u2019@#\/%?=()~_|!:,.;]*[\-A-Z0-9+\u0026@#\/%=~()_|])/gi;
我能够正确捕获以下 URL:
var someString1 = "hello http://stackoverflow.com";
var someString2 = "hello www.stackoverflow.com";
var someString3 = "hello stackoverflow.com";
var someString4 = "hello stackoverflow.com?foo=bar&foo=baz&foo-bar=baz";
但假设我有
var wrappedUrl = "hello (www.stackoverflow.com)";
我捕获了带有括号的 URL(我不希望这样)。如何只捕获 URL?
这无法被捕获。我没有匹配到:
var wrappedUrl = "hello [www.stackoverflow.com]";
最佳答案
你可以使用
/((https?|ftp)\:\/\/)?([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?([a-z0-9-.]*)\.([a-z]{2,4})(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?/gi
请参阅regex demo
说明:
((https?|ftp)\:\/\/)?
- 方案([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?
- 用户名和密码([a-z0-9-.]*)\.([a-z]{2,3})
- 主机名或 IP 地址(\:[0-9]{2,5})?
- 端口地址(\/([a-z0-9+\$_-]\.?)+)*\/?
- 路径(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?
-获取查询(#[a-z_.-][a-z0-9+\$_.-]*)?
- anchor
查看 JS 演示:
var re = /((https?|ftp)\:\/\/)?([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?([a-z0-9-.]*)\.([a-z]{2,4})(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?/gi;
var str = `hello http://stackoverflow.com
hello www.stackoverflow.com
hello stackoverflow.com
hello stackoverflow.com?foo=bar&foo=baz&foo-bar=baz
hello [www.stackoverflow.com]
hello (www.stackoverflow.com)`;
while ((m = re.exec(str)) !== null) {
document.body.innerHTML += m[0] + "<br/>";
}
关于javascript - 如何忽略正则表达式中 URL 周围的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38281987/