如何捕获可选组并在不匹配时替换?

时间:2013-11-01 14:32:03

标签: regex replace grouping

我遇到这种情况,用户可能会输入带或不带http(s)://的网址。如果它在那里我想拥有它,否则我自己添加http://。我有以下正则表达式模式:

正则表达式:\[url\](?:https?\:\/\/)?(.*?)\[\/url\]替换:<a href="$1">$1</a>

使这个

[url]http://blog.sanspace.in[/url]
[url]https://blog.sanspace.in[/url]
[url]blog.sanspace.in[/url]
[url]blog.sanspace.in/scraperwiki[/url]
[url]www.sanspace.in[/url]

进入这个

<a href="http://blog.sanspace.in">http://blog.sanspace.in</a>
<a href="http://blog.sanspace.in">http://blog.sanspace.in</a>
<a href="http://blog.sanspace.in">http://blog.sanspace.in</a>
<a href="http://blog.sanspace.in/scraperwiki">http://blog.sanspace.in/scraperwiki</a>
<a href="http://www.sanspace.in">http://www.sanspace.in</a>

现在,我想要的是这样做。 (如果可用则使用http(s)。否则,http)

<a href="http://blog.sanspace.in">http://blog.sanspace.in</a>
<a href="https://blog.sanspace.in">https://blog.sanspace.in</a>
<a href="http://blog.sanspace.in">http://blog.sanspace.in</a>
<a href="http://blog.sanspace.in/scraperwiki">http://blog.sanspace.in/scraperwiki</a>
<a href="http://www.sanspace.in">http://www.sanspace.in</a>

我尝试将http(s)添加为一个群组。

正则表达式:\[url\](https?\:\/\/)?(.*?)\[\/url\]替换:<a href="$1$2">$1$2</a>

ut,在这种情况下,替换订单$1$2是不同的。如果用户添加了http,则会变为$1,否则网址会变为$1

<a href="http://blog.sanspace.in">http://blog.sanspace.in</a>
<a href="https://blog.sanspace.in">https://blog.sanspace.in</a>
<a href="blog.sanspace.in">blog.sanspace.in</a>
<a href="blog.sanspace.in/scraperwiki">blog.sanspace.in/scraperwiki</a>
<a href="www.sanspace.in">www.sanspace.in</a>

请注意最后3个网址。在这里,我必须添加http,但前提是我知道没有用户添加http。我不确定如何实现我的目标。

我在这里测试这个问题。 http://regexr.com?3711a

1 个答案:

答案 0 :(得分:2)

尝试以下正则表达式:

匹配: \[url\](?:http(s)?\:\/\/)?(.*?)\[\/url\]

替换: <a href="http$1://$2">http$1://$2</a>

regexr demo

由于你愿意插入http://,如果它不在原始字符串中,那么这里的想法就不会捕获它,即使它存在。而是仅捕获可选的s,表示将{http}保密到$1