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).
第二个问题是您将?量词放在捕获组中,使组内的模式可选,但不是整个组.这使得该组始终"参与比赛",并且条件将始终为"真实"(始终匹配).?应量化该群体.
| 归档时间: |
|
| 查看次数: |
5796 次 |
| 最近记录: |