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

编号反向引用

如果正则表达式有命名编号捕获组,那么你可以在替换文本中重新插入由这些捕获组匹配的文本。你的替换文本可以引用任意多个组,甚至可以多次引用同一个组。这使得以多种不同方式重新排列由正则表达式匹配的文本成为可能。作为一个简单的示例,正则表达式 \*(\w+)\* 匹配星号之间的单个单词,并将单词存储在第一个(也是唯一的)捕获组中。替换文本 <b>\1</b> 用捕获组存储的文本替换每个正则表达式匹配项,并在粗体标签之间。实际上,此搜索和替换操作用粗体标签替换星号,保留星号之间的单词。使用反向引用的这种技术很重要。将 *word* 作为一个整体替换为 <b>word</b> 比尝试想出一种方法来正确地分别替换星号容易得多,效率也高得多。

替换文本中反向引用的 \1 语法借用了正则表达式中反向引用的语法\1\9JGsoft 应用程序DelphiPerl(虽然已弃用)、PythonRubyPHPRBoostTcl 支持。双位数反向引用 \10\99 受 JGsoft 应用程序、Delphi、Python 和 Boost 支持。如果正则表达式中没有足够的捕获组来使双位数反向引用有效,那么所有这些风格都将 \10\99 视为一个一位数反向引用,后跟一个文字数字。支持一位数反向引用但不支持双位数反向引用的风格也会这样做。

$1$99 用于单数字和双数字反向引用的 JGsoft 应用程序Delphi.NETJavaJavaScriptVBScriptPCRE2PHPBooststd::regexXPath。这些也是在 Perl 中通过捕获组匹配文本的变量。如果正则表达式中没有足够的捕获组以使双数字反向引用有效,则 $10$99 被视为单数字反向引用,后跟一个文字数字,所有这些风格都适用,但 .NET、Perl、PCRE2 和 std::regex 除外。

在数字 ${1} 周围加上大括号可以将数字与后跟的任何文字数字隔离开来。这在 JGsoft 应用程序、Delphi、.NET、Perl、PCRE2、PHP、Boost 和 XRegExp 中有效。

命名反向引用

如果您的正则表达式有 命名的捕获组,那么您应该在替换文本中对它们使用命名的反向引用。正则表达式 (?'name'group) 有一个名为“name”的组。您可以在 JGsoft 应用程序Delphi.NETPCRE2Java 7XRegExp 中使用 ${name} 来引用此组。PCRE2 还支持没有大括号的 $name。在 Perl 5.10 及更高版本中,您可以内插变量 $+{name}Boost 也在替换字符串中使用 $+{name}${name} 在任何版本的 Perl 中都不起作用。$name 仅适用于 PCRE2。

在 Python 中,如果您有正则表达式 (?P<name>group),那么您可以在替换文本中使用 \g<name> 来使用其匹配项。此语法在 JGsoft 应用程序和 Delphi 中也适用。Python 和 JGsoft 应用程序(但 Delphi 除外)还使用此语法支持带编号的反向引用。在 Python 中,这是唯一一种使带编号的反向引用紧跟一个文字数字的方法。

PHPR 支持正则表达式中的命名捕获组和命名反向引用。但它们不支持替换文本中的命名反向引用。您必须在替换文本中使用编号反向引用来重新插入由命名组匹配的文本。要确定这些编号,请从左到右计算正则表达式中所有捕获组(命名和未命名)的左括号数量。

对不存在的捕获组的反向引用

无效的反向引用是对正则表达式中捕获组数量更大的数字的引用,或者是对正则表达式中不存在的名称的引用。此类反向引用可以通过三种不同的方式处理。Delphi、Perl、Ruby、PHP、R、Boost、std::regex、XPath 和 Tcl 用空字符串替换无效的反向引用。Java、XRegExp、PCRE2 和 Python 将它们视为语法错误。JavaScript(不含 XRegExp)和 .NET 将它们视为文本文字。

原始的 JGsoft 样式 用空字符串替换无效的反向引用。但 JGsoft V2 将它们视为语法错误。使用 V2 样式的所有应用程序都对替换字符串应用语法着色,并以红色突出显示无效的反向引用。

对不参与的捕获组的反向引用

不参与的捕获组是根本不参与匹配尝试的组。这不同于匹配空字符串的组。a(b?)c 中的组始终参与匹配。其内容是可选的,但组本身不是可选的。a(b)?c 中的组是可选的。当正则表达式匹配 abc 时它参与,但当正则表达式匹配 ac 时它不参与。

在大多数应用程序中,对匹配空字符串的组或不参与的组的替换字符串中的反向引用没有区别。两者都用空字符串替换。两个例外是 PythonPCRE2。它们确实允许在替换字符串中对可选捕获组进行反向引用。但如果捕获组碰巧不参与其中一个正则表达式匹配,则搜索和替换将在 PCRE2 中返回错误代码。在 Python 3.4 及更早版本中,相同的情况会引发异常。Python 3.5 不再引发异常。

对编号最高的组的反向引用

JGsoft 应用程序Delphi 中,$+ 会插入由实际参与匹配的最高编号组匹配的文本。在 Perl 5.18 中,变量 $+ 存储相同的文本。当 (a)(b)|(c)(d) 匹配 ab 时,$+ 会替换为 b。当相同的正则表达式匹配 cd 时,$+ 会插入 d。在 JGsoft 应用程序、Delphi 和 Ruby 中,\+ 执行相同操作。

.NETVBScriptBoost 中,$+ 会插入由最高编号组匹配的文本,无论该组是否参与了匹配。如果该组未参与匹配,则不会插入任何内容。在 Perl 5.16 及更早版本中,变量 $+ 存储相同的文本。当 (a)(b)|(c)(d) 匹配 ab 时,$+ 会替换为空字符串。当相同的正则表达式匹配 cd 时,$+ 会插入 d

Boost 1.42 添加了它自己发明的附加语法,用于表示最高编号组的两种含义。对于实际参与匹配的最高编号组匹配的文本,$^N$LAST_SUBMATCH_RESULT${^LAST_SUBMATCH_RESULT} 都会插入该文本。对于最高编号组匹配的文本,无论该组是否参与了匹配,$LAST_PAREN_MATCH${^LAST_PAREN_MATCH} 都会插入该文本。

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

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