我的网址可能位于括号内,如下所示:
[[!;;;;http://example.com/foo]some text]
如何匹配 URL,但当它们位于括号中时则不然,某些文本
也可能是 URL。我需要将所有网址替换为该格式。
到目前为止,我有匹配 URL 的正则表达式:
var url_re = /(\bhttps?:\/\/(?:(?:(?!&[^;]+;)|(?=&))[^\s"'<>\]\[)])+\b)/gi;
输入示例:
http://example.com/foo [[!;;;;http://example.com/foo]some text] http://example.com/foo
输出:
[[!;;;;http://example.com/foo]http://example.com/foo] [[!;;;;http://example.com/foo]some text] [[!;;;;http://example.com/foo]http://example.com/foo]
最佳答案
您可以添加一个 (?![^[\]]*])
否定前瞻,以避免在结束 ]
之前匹配模式任何其他 [
或 ]
:
\b(https?:\/\/(?:(?:(?!&[^;]+;)|(?=&))[^\s"'<>\][)])+)\b(?![^[\]]*])
并替换为[[!;;;;$1]$1]
。请参阅regex demo
另一个选项是匹配并捕获 [...[...]...]
内的所有内容,然后在 String.replace()
内使用回调正确处理每个捕获,但上面看起来“更干净”并且更直接。
关于javascript - 如何匹配 URL 但不在括号中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36977571/