REGEX:在某些情况下添加一个与我的模式不匹配的模式

时间:2015-06-18 22:17:51

标签: javascript regex

我目前拥有这种精彩的模式,似乎对我来说非常适合匹配链接/网址

int main(void) {
   ...
   save_it_for_later<MACRO_USING_DECLTYPE_OR_SOMESUCH(foo)> saved = {t};
   ...
}

我使用此模式查找链接并在我的链接周围插入BBCODE,因此如果我的示例文字为/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi ,我的输出将为http://www.google.com

困难之处在于,如果我的输入文本中已经包含BBCODE,例如[url]http://www.google.com[/url],那么我的输出将获得围绕它的BBCODE的2倍。 [url]http://www.google.com[/url]

我希望以某种方式不匹配已经[url]包含链接的链接。

概要

当前模式:[url][url]http://www.google.com[/url][/url]

当前输出:

/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi

期望的输出:

http://www.google.com ==> [url]http://www.google.com[/url]   
[url]http://www.google.com[/url] ==> [url][url]http://www.google.com[/url][/url]
[url="http://www.google.com"]http://www.google.com[/url] ==> [url][url="http://www.google.com"]http://www.google.com[/url][/url]

2 个答案:

答案 0 :(得分:1)

您可以使用丢弃技术,在此正则表达式的开头添加丢弃模式。所以你可以添加一个丢弃模式来摆脱这样的标签:

\[.+?\].*?\[\/.+?\]|(\b(?:https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])
discard this --^
which is [...]...[/...]

Regular expression visualization

<强> Working demo

正如您在下面的屏幕截图中看到的那样,您将使用红色/绿色(原始正则表达式)和蓝色表示丢弃的图案。

enter image description here

只是为了让你知道,丢弃模式包括在正则表达式的右侧添加你想要除去的所有模式,并使用最右边的捕获组,如下所示:

discard patt1 | discard patt2 | discard pattN | (capture this content)

Regular expression visualization

答案 1 :(得分:0)

我会使用此正则表达式并仅在第一组为空(意味着尚未放置bbcode)时替换为bbcode

/(\[url\])?(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])(\[\/url\])?/gi