2

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

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+)([^{][^\]]*)(\]) 替换:\1{\2}\3

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

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

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

谢谢 !

4

1 回答 1

1

您可以使用

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

请参阅正则表达式演示详情

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

演示截图:

在此处输入图像描述

于 2022-02-19T15:42:56.207 回答