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

替换字符串条件

替换字符串条件允许您在特定捕获组参与匹配时使用一种替换,而在该捕获组未参与匹配时使用另一种替换。它们受JGsoft V2、Boost 和 PCRE2 支持。Boost 和 PCRE2 各自发明了自己的语法。JGsoft V2 支持两者。

要在 Boost 中使用条件,您需要将 regex_constants::format_all 传递给 regex_replace。要在 PCRE2 中使用条件,您需要将 PCRE2_SUBSTITUTE_EXTENDED 传递给 pcre2_substitute

Boost 替换字符串条件

Boost 的语法是 (?1匹配:不匹配),其中 1 是一个介于 1 到 99 之间的数字,引用一个编号的捕获组。 匹配 用作捕获组参与匹配的替换。 不匹配 用于组未参与匹配的替换。冒号 : 界定这两个部分。如果您希望在 匹配 部分使用一个字面冒号,那么您需要用反斜杠对其进行转义。如果您希望在条件中的任何位置使用一个字面右括号,那么您也需要用反斜杠对其进行转义。

括号将条件与替换字符串的其余部分分隔开。 开始(?1匹配:不匹配)结束 在组参与时替换为 开始匹配结束,在组不参与时替换为 开始不匹配结束。JGsoft V2 需要括号。如果在替换中条件后面没有内容,则 Boost 允许您省略括号。因此,?1匹配:不匹配(?1匹配:不匹配) 相同。

匹配不匹配 部分可以为空。如果 不匹配 部分为空,则您可以省略冒号。因此,(?1匹配:)(?1匹配) 在组参与时替换为 匹配。当组不参与时,它们将匹配替换为空内容。

您可以在 matchedunmatched 中使用完全替换字符串语法。这意味着您可以在其他条件内嵌套条件。因此,(?1one(?2two):(?2two:none)) 在两个组都参与时替换为 onetwo,在组 1 或 2 参与而另一个不参与时替换为 onetwo,在两个组都不参与时替换为 none。使用 Boost ?1one(?2two):?2two:none 执行完全相同操作,但省略不必要的括号。

JGsoft V2 正则表达式风格将引用不存在的捕获组的条件视为错误。如果问号后有两个数字,但捕获组不足以使两位数条件有效,则仅将第一个数字用于条件,而第二个数字为文本。因此,当正则表达式中捕获组少于 12 个时,(?12matched) 在捕获组 1 参与匹配时替换为 2matched

Boost 将引用不存在的组号的条件视为对永远不会参与匹配的组的条件。因此,(?12twelve:not twelve) 在正则表达式中捕获组少于 12 个时始终替换为 not twelve

您可以在数字周围放置大括号,以避免单数字和双数字条件之间的歧义。当组 1 参与时,(?{1}1:0) 替换为 1,而不参与时替换为 0,即使正则表达式中有 11 个或更多捕获组。即使正则表达式中组少于 12 个(这可能会使条件无效),(?{12}twelve:not twelve) 始终是引用组 12 的条件。

带大括号的语法还允许您按名称引用命名的捕获组。当组“name”参与匹配时,(?{name}matched:unmatched) 替换为 matched,而不参与时替换为 unmatched。如果组不存在,JGsoft V2 正则表达式风格将条件视为错误。但是,Boost 将引用不存在的组名的条件视为文本。因此,(?{nonexisting}matched:unmatched)?{nonexisting}matched:unmatched 用作文本替换。

PCRE2 替换字符串条件

PCRE2 的语法是 ${1:+匹配:不匹配},其中 1 是 1 到 99 之间的数字,引用编号捕获组。如果你的正则表达式包含命名捕获组,那么你可以通过其名称在条件中引用它们:${name:+匹配:不匹配}

匹配 用作捕获组参与匹配的替换。 不匹配 用作组未参与匹配的替换。 :+ 将组号或名称与条件的第一部分分隔开。第二个冒号分隔两个部分。如果要在 匹配 部分使用一个字面冒号,那么你需要用反斜杠对其进行转义。如果要在条件中的任何位置使用一个字面闭合花括号,那么你也需要用反斜杠对其进行转义。加号除了开始条件的 :+ 之外没有特殊含义,因此不需要对其进行转义。

你可以在 匹配不匹配 中使用完整的替换字符串语法。这意味着你可以在其他条件内嵌套条件。因此 ${1:+一个${2:+两个}:${2:+两个:}} 在两个组都参与时替换为 一个两个,在组 1 或 2 参与而另一个不参与时替换为 一个两个,在两个组都不参与时替换为

${1:-不匹配}${name:-不匹配}${1:+${1}:不匹配}${name:+${name}:不匹配} 的简写。如果组参与匹配,它们会插入组捕获的文本。如果组未参与,它们会插入 不匹配。使用此语法时,:- 将组号或名称与条件的内容分隔开。条件只有一部分,其中冒号和减号没有特殊含义。

PCRE2 和 JGsoft V2 都将引用不存在的捕获组的条件视为错误。

转义问号、冒号、括号和花括号

如上所述,当在条件的 matched 部分中用作字面量时,您需要使用反斜杠来转义您想要用作字面量的冒号。您还需要使用反斜杠在条件中转义字面量闭合括号(Boost)或大括号(PCRE2)。

在支持条件的替换字符串风格中,您可以使用反斜杠转义冒号、括号、大括号,甚至问号,以确保它们在替换字符串中的任何位置都被解释为字面量。但通常没有必要这样做。

冒号在 unmatched 部分或条件外部没有任何特殊含义。因此,您不需要在那里转义它。如果问号后面没有数字或大括号,则它没有任何特殊含义。在 PCRE2 中,它永远没有特殊含义。因此,只有当您想要使用字面量问号后跟字面量数字或大括号作为 Boost 或 JGsoftV2 中的替换时,才需要使用反斜杠转义问号。

在 JGsoft V2 风格中,开括号是条件语法的组成部分。紧随其后的第一个未转义的闭合括号将结束条件。所有其他未转义的开括号和闭合括号都是字面量。

Boost 始终使用括号进行分组。未转义的开括号始终打开一个组。组可以嵌套。未转义的闭合括号始终关闭一个组。没有匹配开括号的未转义闭合括号实际上截断了替换字符串。因此,Boost 要求您始终使用反斜杠转义字面量括号。

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

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