考虑以下正则表达式:([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 ++ 实际上是在处理,而不是作为条件标识符。知道我在做什么错吗?
1 回答
慕田峪4524236
TA贡献1875条经验 获得超5个赞
条件替换的语法是
(?{GROUP_MATCHED?}REPLACEMENT_IF_YES:REPLACEMENT_IF_NO}
当处理高于9的组和命名捕获组时,必须使用{和}来避免歧义。
由于Notepad ++使用Boost-Extended Format String Syntax,请参阅以下Boost文档:
字符?开始一个条件表达式,一般形式为:
?Ntrue-expression:false-expression
其中N的十进制数字。
如果子表达式N匹配,则将true-expression求值并发送到输出,否则false-expression将求值并发送到输出。
通常,您需要将条件表达式括在括号中,以防止歧义。
例如,如果(?1foo:bar)匹配foo子表达式,则格式字符串将替换找到的每个匹配项,否则替换$1为bar。
对于索引大于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)。
第二个问题是您将?量词放置在捕获组内,使该组内的模式可选,但不是整个组。这使得小组始终“参与比赛”,而条件始终是“ true”(总是匹配)。?应该量化组。
- 1 回答
- 0 关注
- 829 浏览
添加回答
举报
0/150
提交
取消