Notepad++中使用正则表达式匹配替换[expr ...]为[expr {...}]的问题求助(含嵌套场景)
解决Notepad++中
[expr ...]的批量括号包裹问题 我来帮你搞定这个正则匹配的需求!你之前的正则没法处理嵌套方括号的场景(比如案例e里的[expr [string first - $SECNAME] -1]),而Notepad++支持PCRE正则,我们可以用平衡组递归匹配来实现单个正则覆盖所有情况。
最终解决方案
查找正则
(\[expr\s+)(?!{)((?:[^[\]]|(\[(?2)\]))*)(\])
替换表达式
\1{\2}\3
正则解释
让我拆解一下这个正则的各个部分,帮你理解它为什么能覆盖所有场景:
(\[expr\s+):捕获[expr(\s+匹配任意数量的空白符,包括空格、制表符),对应替换里的\1(?!{):负向前瞻,确保当前位置后面没有{,这样就只会处理还没加大括号的[expr ...],不会碰已经有{}的结构((?:[^[\]]|(\[(?2)\]))*):这是核心的平衡组,用来正确匹配expr后面的内容,包括嵌套的方括号:[^[\]]:匹配任何不是方括号的字符(\[(?2)\]):递归规则,匹配一个[后,重复调用当前捕获组的规则(也就是处理里面嵌套的方括号),最后匹配],这样不管嵌套多少层方括号都能正确识别
(\]):捕获结尾的],对应替换里的\3
验证所有案例
把这个正则用到你的代码上,所有场景都会被正确处理:
- 原代码:
set a [expr $sumy+1]→ 替换后:set a [expr {$sumy+1}] - 原代码:
set b [[expr $sumy+1] [expr $sumy+2] [expr $sumy+3]]→ 替换后:set b [[expr {$sumy+1}] [expr {$sumy+2}] [expr {$sumy+3}]] - 原代码:
set c [expr $sumy+[lindex $coords 1]]→ 替换后:set c [expr {$sumy+[lindex $coords 1]}] - 原代码:
set d [expr [lindex [$ret] 2] + $Alpha]→ 替换后:set d [expr {[lindex [$ret] 2] + $Alpha}] - 原代码:
set e [string range $SECNAME 0 [expr [string first - $SECNAME] -1] ]→ 替换后:set e [string range $SECNAME 0 [expr {[string first - $SECNAME] -1}] ]
Notepad++操作步骤
- 打开你的代码文件,按下
Ctrl+H打开替换对话框 - 在对话框上方切换到「正则表达式」模式(不需要勾选「.匹配换行符」,除非你的
expr内容跨行了) - 把上面的查找正则粘贴到「查找目标」框,替换表达式粘贴到「替换为」框
- 点击「全部替换」,所有符合要求的
[expr ...]都会被自动加上大括号
内容的提问来源于stack exchange,提问作者JFl
相关产品推荐
相关产品推荐

