《正则表达式经典实例(第2版)》——2.20 在替代文本中添加正则匹配

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个捕获分组的语法,但是使用哪种语法并不重要。因为结果都是一样的。

时间: 2024-12-23 10:51:13

《正则表达式经典实例(第2版)》——2.20 在替代文本中添加正则匹配的相关文章

《正则表达式经典实例(第2版)》——2.19 在替代文本中添加字面文本

2.19 在替代文本中添加字面文本 问题描述查找并把任何正则表达式匹配从字面上替换为这8个字符:$%*$11. 解决方案 $%\*$$1\1 替代文本流派:.NET.JavaScript \$%\\*\$1\\1 替代文本流派:Java $%\*\$1\\1 替代文本流派:PHP \$%\*\$1\\1 替代文本流派:Perl $%\*$1\\1 替代文本流派:Python.Ruby 讨论在替代文本中转义字符的时机和方式这个实例显示了各种替代文本流派中使用的不同转义规则.在替代文本中,你可能会需

《正则表达式经典实例(第2版)》——导读

** 前言 **正则表达式在过去十多年间越来越普及.如今,所有常用的编程语言都会包含一个强大的正则表达式函数库,甚至在语言本身就内嵌了对于正则表达式的支持.许多开发人员都会利用这些正则表达式的功能,在应用程序中为用户提供使用正则表达式对其数据进行查找或者过滤的能力.正则表达式已经无处不在.随着正则表达式的广泛采用,出现了许多相关的著作.其中大多数都很好地讲解了正则表达式的语法,并且还会提供一些例子以及参考实现.然而,我们还没有看到有任何一本书能够针对处理计算机和不同因特网应用上的文本所遇到的各种

《正则表达式经典实例(第2版)》——2.21 把部分的正则匹配添加到替代文本中

2.21 把部分的正则匹配添加到替代文本中 问题描述匹配任意10个数字的连续序列,如1234567890.并把这个序列转换成(美国)电话号码的常见格式,如(123) 456-7890, 解决方案正则表达式 \b(\d{3})(\d{3})(\d{4})\b 正则选项:无 正则流派:.NET.Java.JavaScript.PCRE.Perl.Python.Ruby 替代文本 ($1)●$2-$3 替代文本流派:.NET.Java.JavaScript.PHP.Perl (${1})●${2}-$

《正则表达式经典实例(第2版)》——1.3 正则表达式工具

1.3 正则表达式工具 除非已经拥有了相当长的使用正则表达式编程的经验,否则建议你先在一个工具中试验一下正则表达式,而不是直接在源代码中使用它们.本章和第2章中提供的正则表达式示例都是原始正则表达式,其中并不包含编程语言(即使是Unlx shell)所必需的额外的转义符号.因此可以直接把这些正则表达式输入到一个应用程序的查找框中. 第3章讲解如何把正则表达式整合到源代码中.把一个字面的(literal)正则表达式作为一个字符串引用,会让它更加难懂,因为字符串的转义规则会与正则表达式的转义规则混杂

《正则表达式经典实例(第2版)》——1.2 使用正则表达式进行查找和替换

1.2 使用正则表达式进行查找和替换 查找和替换(search-and-replace)对正则表达式来说是一个常见的任务.查找和替换的功能会接受一个目标字符串.一个正则表达式和一个替代字符串作为输入.它的输出则是把目标字符串中所有与正则表达式相匹配的字符串都替换为"替代文本". 虽然替代文本(replacement text)并不是一个正则表达式,读者也可以使用某些特殊的语法构造动态的替代文本.所有的流派都允许把正则表达式或者某个捕获分组匹配到的文本,重新添加到替代字符串中.实例2.2

《正则表达式经典实例(第2版)》——2.9 分组和捕获匹配中的子串

2.9 分组和捕获匹配中的子串 问题描述 改进匹配Mary.Jane或Sue的正则表达式,使之只能匹配完整单词.使用分组来实现这个功能,整个正则表达式只需要一对单词分界符,而不是给每个选择分支都使用一对分界符. 创建一个正则表达式,使之匹配yyyy-mm-dd格式的任意日期,并且分别捕获年.月和日.目标是在处理匹配的代码中可以更容易处理这些分别捕获的值.你可以假设目标文本中的所有日期都是合法的.正则表达式不必要考虑去掉像9999-99-99这样的非法数据,因为它们根本不可能出现在目标文本中. 解

《正则表达式经典实例(第2版)》——2.6 匹配完整单词

2.6 匹配完整单词 问题描述创建一个正则表达式来匹配My cat is brown中的cat,同时不能匹配category或是bobcat.再创建一个正则表达式来匹配staccato中的cat,同时不能匹配到上面的3个目标字串. 解决方案单词边界 \bcat\b 正则选项:无 正则流派:.NET.Java.JavaScript.PCRE.Perl.Python.Ruby 非单词边界 \Bcat\B 正则选项:无 正则流派:.NET.Java.JavaScript.PCRE.Perl.Pytho

《正则表达式经典实例(第2版)》——2.22 把匹配上下文插入到替代文本中

2.22 把匹配上下文插入到替代文本中 问题描述创建一个替代文本,用来把正则表达式匹配的文本替换为匹配之前的文本紧跟完整目标文本再紧跟匹配之后的文本.例如,如果在BeforeMatchAfter中找到的是Match,那么把这个匹配换成BeforeBeforeMatchAfterAfter,最终得到的新文本是BeforeBefore BeforeMatchAfterAfterAfter. 解决方案 $`$_$' 替代文本流派:.NET.Perl \`\`\&\'\' 替代文本流派:Ruby $`$

《正则表达式经典实例(第2版)》——2.2 匹配不可打印字符

2.2 匹配不可打印字符 问题描述 匹配一个包含下列ASCII控制字符的字符串:振铃符(bell).转义符(escape).换页符(form feed).换行符(line feed).回车符(carriage return).水平制表符(horizontal tab)和垂直制表符(vertical tab).这些字符的十六进制ASCII编码分别是07.1B.0C.0A.0D.09.0B. 下面演示了转义序列的用法,以及如何以十六进制编码代表字符. 解决方案 \a\e\f\n\r\t\v 正则选项