通过正则表达式在 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++ 中替换时如何使用条件的主要内容,如果未能解决你的问题,请参考以下文章