替换文本教程 |
简介 |
字符 |
不可打印字符 |
匹配文本 |
反向引用 |
匹配上下文 |
大小写转换 |
条件 |
本网站上的更多内容 |
简介 |
正则表达式快速入门 |
正则表达式教程 |
替换字符串教程 |
应用程序和语言 |
正则表达式示例 |
正则表达式参考 |
替换字符串参考 |
书评 |
可打印 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 的语法是 (?1匹配:不匹配),其中 1 是一个介于 1 到 99 之间的数字,引用一个编号的捕获组。 匹配 用作捕获组参与匹配的替换。 不匹配 用于组未参与匹配的替换。冒号 : 界定这两个部分。如果您希望在 匹配 部分使用一个字面冒号,那么您需要用反斜杠对其进行转义。如果您希望在条件中的任何位置使用一个字面右括号,那么您也需要用反斜杠对其进行转义。
括号将条件与替换字符串的其余部分分隔开。 开始(?1匹配:不匹配)结束 在组参与时替换为 开始匹配结束,在组不参与时替换为 开始不匹配结束。JGsoft V2 需要括号。如果在替换中条件后面没有内容,则 Boost 允许您省略括号。因此,?1匹配:不匹配 与 (?1匹配:不匹配) 相同。
匹配 和 不匹配 部分可以为空。如果 不匹配 部分为空,则您可以省略冒号。因此,(?1匹配:) 和 (?1匹配) 在组参与时替换为 匹配。当组不参与时,它们将匹配替换为空内容。
您可以在 matched 和 unmatched 中使用完全替换字符串语法。这意味着您可以在其他条件内嵌套条件。因此,(?1one(?2two):(?2two:none)) 在两个组都参与时替换为 onetwo,在组 1 或 2 参与而另一个不参与时替换为 one 或 two,在两个组都不参与时替换为 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 的语法是 ${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 要求您始终使用反斜杠转义字面量括号。
页面网址:https://regexper.cn/replaceconditional.html
页面上次更新时间:2021 年 8 月 12 日
网站上次更新时间:2024 年 3 月 15 日
版权所有 © 2003-2024 Jan Goyvaerts。保留所有权利。