通过正则表达式在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 ++ 实际上是在处理,而不是作为条件标识符。知道我在做什么错吗?


红糖糍粑
浏览 761回答 1
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”(总是匹配)。?应该量化组。
打开App,查看更多内容
随时随地看视频慕课网APP