本节书摘来自异步社区《正则表达式经典实例(第2版)》一书中的第2章,第2.20节,作者: 【美】Jan Goyvaerts , Steven Levithan著,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.20 在替代文本中添加正则匹配
问题描述
执行查找和替换,把所有URL都转换成指向该URL的HTML链接,并使用该URL作为链接的文本。在这个练习中,把URL定义为“http:”以及其后所有的非空字符。例如,Please visit应该被转换为Please visit。
解决方案
正则表达式
http:\S+
正则选项:无
正则流派:.NET、Java、JavaScript、PCRE、Perl、Python、Ruby
替代文本
<a●href="$&">$&</a>
替代文本流派:.NET、JavaScript、Perl
<a●href="$0">$0</a>
替代文本流派:.NET、Java、XRegExp、PHP
<a●href="\0">\0</a>
替代文本流派:PHP、Ruby
<a●href="\&">\&</a>
替代文本流派:Ruby
<a●href="\g<0>">\g<0></a>
替代文本流派:Python
讨论
把整个正则匹配重新插回到替代文本中,是在匹配文本之前、之后或者两边,甚至是在匹配文本的多个副本之间插入新文本的一种比较容易的方式。除Python之外,你都不必在正则表达式中添加任何捕获分组,就能够在替换中使用整个匹配结果。
在Perl中,«$&»实际上是一个变量。在每次正则表达式匹配成功之后,Perl都会把完整正则匹配保存到这个变量中。在正则式中使用«$&»会带来性能损失,所以你可能更倾向使用捕获分组包裹整个正则式,以及指向该分组的反向引用。
.NET和JavaScript沿用了«$&»的语法来把正则匹配插入到替代文本中。Ruby使用反斜杠而不是美元符号作为替代文本中的记号,因此会使用«&»来指代整个匹配。
Java、PHP和Python中并不存在一个特殊记号来重新插入整个正则匹配,但是它们也允许把捕获分组匹配到的文本插入到替代文本中,这会在下一小节中进行讲解。整个匹配则是一个编号为0的隐式捕获分组。对于Python来说,我们需要使用命名捕获的语法以引用0号分组。在Python中并不支持«0»。
.NET、XRegExp和Ruby也支持第0个捕获分组的语法,但是使用哪种语法并不重要。因为结果都是一样的。