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

2.19 在替代文本中添加字面文本

问题描述
查找并把任何正则表达式匹配从字面上替换为这8个字符:$%*$11。

解决方案

$%\*$$1\1
替代文本流派:.NET、JavaScript
\$%\\*\$1\\1
替代文本流派:Java
$%\*\$1\\1
替代文本流派:PHP
\$%\*\$1\\1
替代文本流派:Perl
$%\*$1\\1
替代文本流派:Python、Ruby

讨论
在替代文本中转义字符的时机和方式
这个实例显示了各种替代文本流派中使用的不同转义规则。在替代文本中,你可能会需要转义的两个字符是美元符号($)和反斜杠()。而它们所使用的转义字符也分别是美元符号和反斜杠。

在这个例子中的百分号(%)和星号(*)总是字面字符,然而一个前导的反斜杠也可能会被当作一个转义字符,而不是一个字面上的反斜杠。«$1»和/或«1»是指向一个捕获分组的反向引用。实例2.21中会讲解哪些流派对于反向引用会使用哪种语法。这个题目对于我们讲到的7种替代文本流派就存在了5种解决方案,这个事实也说明,关于替代文本的语法,根本就没什么标准。

.NET和JavaScript
.NET和JavaScript总是把反斜杠当作一个字面字符。不需要再用另外一个反斜杠来对它进行转义,否则就会在替换中得到两个反斜杠。

单个出现的美元符号也是一个字面字符。只有当它们之后是数字、&、反引号、垂直引号、下划线、加号或者另外一个美元符号的时候,才需要被转义。要转义美元符号,需要在它前面再加一个美元符号。

如果你觉得这样会读起来更加清晰,也可以选择把所有的美元符号都用两个来表示。下面这个解答也是同样正确的:

$$%\*$$1\1
替代文本流派:.NET、JavaScript

.NET和XregExp还要求对后面跟着一个起始花括号的美元符号进行转义。在.NET中,«${group}»是一个命名反向引用。标准JavaScript中没有使用XRegExp库时则不支持命名反向引用。

Java
在Java中,反斜杠用来在替代文本中转义反斜杠和美元符号。所有字面的反斜杠和所有字面的美元符号都必须转义。如果你不转义它们,Java就会抛出一个异常。

PHP
PHP要求后面跟数字的反斜杠、后面跟数字或者起始花括号的美元符号,都需要使用反斜杠来进行转义。

反斜杠也可以对另外一个反斜杠进行转义。因此,你需要使用«\»来在替换文本中表示两个字面上的反斜杠。所有其他的反斜杠都被认为是字面上的反斜杠。

Perl
Perl与其他替代文本流派都有些不同:它其实不能归属到任何一种替代文本流派。虽然其他编程语言都在查找和替换过程中使用一些特殊逻辑进行替换,比如«$1»,然而Perl中这只是正常的变量插值(interpolation)。在替代文本中,需要对所有字面上的美元符号用反斜杠进行转义,就像在任意双引号字符串中一样。

一个例外是Perl同样支持反向引用的«1»语法。因此,如果你需要字面上的反斜杠后跟数字,则需要对反斜杠进行转义。为了避免反斜杠对美元符号进行转义,因此需要对后面跟着美元符号的反斜杠进行转义。

反斜杠也可以转义另外一个反斜杠。因此,你需要使用«\»来在替换文本中表示两个字面上的反斜杠。所有其他的反斜杠都视为字面上的反斜杠。

Python和Ruby
美元符号在Python和Ruby的替代文本中并不拥有特殊含义。如果反斜杠后面跟着一个会给反斜杠赋予特殊含义的字符,那么这个反斜杠就需要使用另外一个反斜杠进行转义。

在Python中,«1»~«9»,以及«g<»会创建反向引用。因此这些反斜杠就需要进行转义。

在Ruby中,你需要对后面跟着数字、&、反引号、垂直引号或者加号的反斜杠进行转义。

在这两种语言中,反斜杠都可以转义另外一个反斜杠。因此,你需要使用«\»在替换文本中表示两个字面上的反斜杠。所有其他的反斜杠都视为字面上的反斜杠。

更多关于字符串字面量的转义规则
记住在本章中,我们关心的只是正则表达式和替代文本自身。下一章会讲解编程语言和字符串字面量的内容。

上述替代文本作为实际字符串变量直接传递给replace()函数是可以正常工作的。换句话说,如果你在应用程序中给用户提供一个文本框,让用户输入替代文本,那么这些解决方案所给出的文本,正是用户为了让查找和替换正常工作所需要输入的内容。如果你使用RegexBuddy或者另外一个正则测试工具来测试查找和替换命令,那么在这个实例中给出的替代文本也同样会给出所期望的结果。

但是如果你把它们直接粘贴到源代码中,在两边放上引号字符,那么这些同样的替代文本并不能正常使用。编程语言中的字符串文本拥有它们自己的转义规则,因此你需要在替代文本的转义规则之上再遵循这些转义规则才行。最终你所得到的很可能会是一堆混杂的反斜杠。

时间: 2024-09-21 23:22:35

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

《正则表达式经典实例(第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版)》——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="$&&quo

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

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

《正则表达式经典实例(第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 正则选项

《正则表达式经典实例(第2版)》——第 1 章 正则表达式简介 1.1正则表达式的定义

第 1 章 正则表达式简介 在你打开这本书的时候,很可能已经热切地期望,要在代码中插入本书中找到的那些包含诸多括号和问号的古怪字符串了.如果你已经准备好要"即查即用",我们非常欢迎,第4-9章中会列出并讲解了各种实用的正则表达式. 但是如果阅读本书的前几章,你将为未来节省大量的时间.例如,本章会向读者介绍许多工具-其中一些工具是本书作者之一的Jan所开发的,这些工具可以帮你事先测试和调试正则表达式,而不用等到把它们塞到代码中之后再处理,那时候查找错误就非常困难了.而且开始这几章还会展示

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

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

《正则表达式经典实例(第2版)》——2.3 匹配多个字符之一

2.3 匹配多个字符之一 问题描述 创建一个正则表达式来匹配calendar的所有常见的错误拼写形式,使你能够在一份文档中找到这个单词而无需依赖作者的拼写能力.在每个元音位置都允许使用a或者e.创建另外一个正则表达式来匹配一个单个的十六进制字符.再创建一个正则表达式来匹配不属于十六进制字符的单个字符. 本节中的这个问题用于解释一个重要的.经常使用的正则结构-字符组(character class). 解决方案 错误拼写的calendar c[ae]l[ae]nd[ae]r 正则选项:无 正则流派

《正则表达式经典实例(第2版)》——2.12 把正则表达式的一部分重复多次

2.12 把正则表达式的一部分重复多次 问题描述 创建正则表达式来匹配下列种类的数字. 一个googol(一个100位的十进制整数). 一个32位的十六进制整数. 一个32位的十六进制整数,带有一个可选的h后缀. 一个浮点数,包含可选的整数部分.必需的小数部分和可选的指数部分.每个部分都允许任意多个数字. 解决方案 Googol \b\d{100}\b 正则选项:无 正则流派:.NET.Java.JavaScript.PCRE.Perl.Python.Ruby 十六进制整数 ```javascr