通过正则表达式在 Notepad++ 中替换时如何使用条件

Posted

技术标签:

【中文标题】通过正则表达式在 Notepad++ 中替换时如何使用条件【英文标题】:How to use conditionals when replacing in Notepad++ via regex 【发布时间】:2016-09-06 18:05:36 【问题描述】:

考虑以下正则表达式:

([a-zA-Z])([a-zA-Z]?)/([a-zA-Z])([a-zA-Z]?)

如果文字是:a/b 捕获组将是:

/1  'a'
/2  ''
/3  'b'
/4  ''

如果文本是:aa/b 捕获组将是:

/1  'a'
/2  'a'
/3  'b'
/4  ''

假设,我想在 Notepad++ 中查找并替换这个字符串,这样如果 /2/4 为空(如上面的第一种情况),我会在前面加上 c

因此,文本 a/b 变为 ca/cb。 而文本aa/b 变为aa/cb

我使用以下正则表达式进行替换:

(?(2)\1\2|0\1)/(?(4)\3\4|0\3)

但 Notepad++ 在这种情况下将? 视为字面意思,而不是作为条件标识符。知道我做错了什么吗?

【问题讨论】:

我认为您对? 的放置可能不正确,这可能是 Notepad++ 将它们视为文字的原因。 【参考方案1】:

条件替换中的语法是

(?GROUP_MATCHED?REPLACEMENT_IF_YES:REPLACEMENT_IF_NO)

对于处理大于 9 的组和命名的捕获组时避免歧义是必要的。

由于 Notepad++ 使用 Boost-Extended Format String Syntax,请参阅此Boost documentation:

字符?开始一个条件表达式,一般形式为:

?Ntrue-expression:false-expression

N 是十进制数字。

如果匹配子表达式 N,则计算 true-expression 并将其发送到输出,否则计算 false-expression 并将其发送到输出。

您通常需要用括号将条件表达式括起来以防止歧义。

例如,如果匹配子表达式$1,则格式字符串(?1foo:bar) 将替换找到的每个匹配项foo,否则替换为bar

对于索引大于 9 的子表达式,或访问命名子表达式,请使用:

?INDEXtrue-expression:false-expression

?NAMEtrue-expression:false-expression

所以,使用([a-zA-Z])([a-zA-Z])?/([a-zA-Z])([a-zA-Z])? 并替换为(?2$1$2:c$1)/(?4$3$4:c$3)

第二个问题是您将? 量词放在捕获组内,使组内的模式可选,但不是整个组。这使得该组始终“参与比赛”,并且条件将始终为“真”(始终匹配)。 ? 应该量化组

【讨论】:

您还可以链接到特定于 Notepad++ 的文档(如果有的话)吗? 我包含了 Boost 参考。

以上是关于通过正则表达式在 Notepad++ 中替换时如何使用条件的主要内容,如果未能解决你的问题,请参考以下文章

[技]如何在 notepad++ 里面使用正则表达式进行替换

notepad正则怎么替换其中一部分

NotePad++ 正则表达式

Notepad++ 正则表达式替换 - \1 不起作用?

正则表达式在Notepad ++中查找/替换多个文本

Notepad++怎么删除空行