正则表达式在代码中查找特定模式并将其替换为新模式

Regex to find a specific pattern in code and replace it with a new pattern

我是正则表达式的新手,我找不到一种方法来做我想做的事。让我解释。 我在 Notepad++ 中有一段代码看起来像这样:

set a [expr $sumy+1]
set b [[expr $sumy+1] [expr $sumy+2] [expr $sumy+3]]
set c [expr $sumy+[lindex $coords 1]]
set d [expr [lindex [$ret] 2] + $Alpha]
set e [string range $SECNAME 0 [expr [string first - $SECNAME] -1] ]

我必须用 [expr {...}] 替换每个 [expr … ] 模式(如果括号已经存在,则不能替换):

set a [expr {$sumy+1}]
set b [[expr {$sumy+1}] [expr {$sumy+2}] [expr {$sumy+3}]]
set c [expr {$sumy+[lindex $coords 1]}]
set d [expr {[lindex [$ret] 2] + $Alpha}]
set e [string range $SECNAME 0 [expr {[string first - $SECNAME] -1}] ]

为了完成这项工作,我使用正则表达式查找每个 expr 模式并将其替换为新模式。对于情况 a 和 b,此正则表达式工作正常:

查找:(\[expr\s+)([^{][^\]]*)(\]) 替换:{}

对于案例 c 和 d,我使用的是这个:

查找:((\[expr\s+)([^{][^\].*\]]*)(\].*)(\])) 替换:{} (https://regex101.com/r/ZU6mNd/1)

但我找不到正确匹配案例 e 的 expr 模式的方法。任何人都可以帮我吗? 我还想知道是否有办法用一个正则表达式匹配所有案例?也许递归?

谢谢!

您可以使用

查找内容(\[expr\s+)((?:(\[(?:[^][]++|(?3))*])|[^][{}])*)(])
替换为{}

regex demo详情:

  • (\[expr\s+) - 第 1 组:
  • ((?:(\[(?:[^][]++|(?3))*])|[^][{}])*) - 第 2 组:零次或多次出现
    • (\[(?:[^][]++|(?3))*]) - 第 3 组:[,然后 [] 或第 3 组模式递归以外的任何一个或多个字符的零个或多个序列,然后是 ] char
    • | - 或
    • [^][{}] - []{}
    • 以外的字符
  • (]) - 第 4 组:一个 ] 个字符。

演示截图: