为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

考虑以下正则表达式:


([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

条件替换的语法是


(?{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”(总是匹配)。?应该量化组。

//img1.sycdn.imooc.com/5dad5cab0001169006100405.jpg

查看完整回答
反对 回复 2019-10-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信