快速入门
教程
工具和语言
示例
参考
书评
替换文本教程
简介
字符
不可打印字符
匹配文本
反向引用
匹配上下文
大小写转换
条件
本网站的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书评
可打印 PDF
关于本网站
RSS 源和博客

特殊字符

最基本的替换字符串仅包含文本字符。替换 replacement 仅用文本 replacement 替换每个正则表达式匹配项。

因为我们希望能够执行的操作不仅仅是用完全相同的文本替换每个正则表达式匹配项,所以我们需要保留某些字符以供特殊用途。在大多数替换文本风格中,两个字符往往具有特殊含义:反斜杠 \ 和美元符号 $。是否以及如何转义它们取决于你正在使用的应用程序。在某些应用程序中,当你想将它们用作文本字符时,你始终需要转义它们。在其他应用程序中,你仅需要在它们与后面的字符形成替换文本令牌时转义它们。

JGsoft 风格Delphi 中,你可以使用反斜杠转义反斜杠和美元符号,并且可以使用美元符号转义美元符号。 \\ 用文本反斜杠替换,而 \$$$ 用文本美元符号替换。你仅需要转义它们以抑制它们与其他字符组合时的特殊含义。在 \!$! 中,反斜杠和美元符号是文本字符,因为它们与感叹号组合时没有特殊含义。你不能转义感叹号或除反斜杠和美元符号之外的任何其他字符,也不需要这样做,因为它们在 JGsoft 和 Delphi 替换字符串中没有特殊含义。

.NETJavaScriptVBScriptXRegExpPCRE2std::regex 中,可以使用另一个美元符号转义美元符号。 $$ 用一个文本美元符号替换。XRegExp 和 PCRE2 要求转义所有文本美元符号。它们将未转义的美元符号(不构成有效的替换文本令牌)视为错误。在 .NET、JavaScript(不含 XRegExp)和 VBScript 中,只需转义美元符号即可抑制其与其他字符组合时的特殊含义。在 $\$! 中,美元符号是一个文本字符,因为它与反斜杠或感叹号组合时没有特殊含义。不能也不需要转义反斜杠、感叹号或除美元符号以外的任何其他字符,因为它们在 .NET、JavaScript、VBScript 和 PCRE2 替换字符串中没有特殊含义。

Java 中,未转义的美元符号(不构成令牌)是一个错误。必须使用反斜杠或另一个美元符号转义美元符号,才能将其用作文本字符。 $! 是一个错误,因为美元符号未转义,并且与感叹号组合时没有特殊含义。反斜杠始终转义其后的字符。 \! 用一个文本感叹号替换,\\ 用一个反斜杠替换。替换文本末尾的单个反斜杠是一个错误。

PythonRuby 中,美元符号没有特殊含义。可以使用反斜杠转义反斜杠。只需转义反斜杠即可抑制其与其他字符组合时的特殊含义。在 \! 中,反斜杠是一个文本字符,因为它与感叹号组合时没有特殊含义。不能也不需要转义感叹号或除反斜杠以外的任何其他字符,因为它们在 Python 和 Ruby 替换字符串中没有特殊含义。但是,替换文本末尾的未转义反斜杠在 Python 中是一个错误,而在 Ruby 中是一个文本反斜杠。

PHP 的 preg_replace 中,可以使用反斜杠来转义反斜杠和美元符号。 \\ 替换为一个实际的反斜杠,而 \$ 替换为一个实际的美元符号。你只需要转义它们来抑制它们与其他字符组合时的特殊含义。在 \! 中,反斜杠是一个实际字符,因为它与感叹号组合时没有特殊含义。你不能也不需要转义感叹号或除反斜杠和美元符号之外的任何其他字符,因为它们在 PHP 替换字符串中没有特殊含义。

Boost 中,反斜杠始终转义其后的字符。 \! 替换为一个实际的感叹号,而 \\ 替换为一个反斜杠。替换文本末尾的单个反斜杠会被忽略。未转义的美元符号是一个实际的美元符号,如果它不形成替换字符串标记。你可以使用反斜杠或另一个美元符号来转义美元符号。因此,$$$\$ 都替换为一个美元符号。

R 中,美元符号没有特殊含义。反斜杠始终转义其后的字符。 \! 替换为一个实际的感叹号,而 \\ 替换为一个反斜杠。替换文本末尾的单个反斜杠会被忽略。

Tcl 中,和号 & 有特殊含义,如果你想在替换文本中使用一个实际的和号,则必须使用反斜杠转义它。你可以使用反斜杠来转义反斜杠。你只需要转义反斜杠来抑制它与其他字符组合时的特殊含义。在 \! 中,反斜杠是一个实际字符,因为它与感叹号组合时没有特殊含义。你不能也不需要转义感叹号或除反斜杠和和号之外的任何其他字符,因为它们在 Tcl 替换字符串中没有特殊含义。替换文本末尾的未转义的反斜杠是一个实际的反斜杠。

XPath 中,未转义的反斜杠是一个错误。未转义的、不形成标记的美元符号也是一个错误。你必须使用反斜杠转义反斜杠和美元符号,才能将它们用作实际字符。反斜杠没有特殊含义,除了转义另一个反斜杠或美元符号。

Perl 是一种特殊情况。Perl 实际上没有替换文本语法。因此,它也没有用于替换文本的转义规则。在 Perl 源代码中,替换字符串只是双引号字符串。反向引用在替换文本中看起来像实际插值变量。即使在不执行搜索和替换时,你也可以在正则表达式匹配后在任何其他双引号字符串中插入它们。

特殊字符和编程语言

上一部分中的规则解释了这些编程语言中的搜索和替换函数如何解析替换文本。如果你的应用程序从用户输入中接收替换文本,则应用程序的用户必须遵循这些转义规则,并且只能遵循这些规则。你可能会惊讶地发现单引号和双引号之类的字符不是特殊字符。这是正确的。在使用 正则表达式或 grep 工具(如 PowerGREP 或 文本编辑器(如 EditPad Pro)的搜索和替换函数)时,你不应该像在编程语言中那样转义或重复引号字符。

如果你在源代码中将替换文本指定为字符串常量,那么你必须记住编程语言在字符串常量中对哪些字符进行特殊处理。这是因为这些字符由编译器处理,在替换文本函数看到字符串之前。例如,Java 要用单个美元符号替换所有正则表达式匹配项,你需要使用替换文本 \$,你需要在源代码中将其输入为 "\\$"。Java 编译器将源代码中的转义反斜杠转换为传递给 replaceAll() 函数的字符串中的单个反斜杠。然后,该函数将单个反斜杠和美元符号视为转义的美元符号。

请参阅本网站的 工具和语言 部分,以获取有关如何在各种编程语言中使用替换字符串的更多信息。

| 快速入门 | 教程 | 工具和语言 | 示例 | 参考 | 书籍评论 |

| 简介 | 字符 | 不可打印字符 | 匹配文本 | 反向引用 | 匹配上下文 | 大小写转换 | 条件 |