如何在通过regex在Notepad ++中替换时使用条件

Cin*_*out 10 regex conditional notepad++

考虑以下正则表达式:

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

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

/1  'a'
/2  ''
/3  'b'
/4  ''
Run Code Online (Sandbox Code Playgroud)

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

/1  'a'
/2  'a'
/3  'b'
/4  ''
Run Code Online (Sandbox Code Playgroud)

假设,我想在Notepad ++中查找并替换此字符串,以便if /2/4为空(如上面的第一种情况),我预先添加c.

所以,文本a/b变成了ca/cb.文本aa/b变成了aa/cb

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

(?(2)\1\2|0\1)/(?(4)\3\4|0\3)
Run Code Online (Sandbox Code Playgroud)

但Notepad ++ ?在这种情况下是字面上的处理,而不是条件标识符.知道我做错了什么吗?

Wik*_*żew 13

条件替换中的语法是

(?{GROUP_MATCHED?}REPLACEMENT_IF_YES:REPLACEMENT_IF_NO}
Run Code Online (Sandbox Code Playgroud)

{}是必要的,以避免歧义,当你对付高于9组,分别命名捕捉组.

自Notepad ++使用以来Boost-Extended Format String Syntax,请参阅此Boost文档:

角色?开始一个条件表达式,一般形式是:

?Ntrue-expression:false-expression

哪里N是十进制数字.

如果子表达式N匹配,则true-expression评估并发送到输出,否则false-expression评估并发送到输出.

您通常需要用括号括起条件表达式以防止出现歧义.

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

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

?{INDEX}true-expression:false-expression

要么

?{NAME}true-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).

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

在此输入图像描述