正则表达式在代码中查找特定模式并将其替换为新模式
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 组:一个 ]
个字符。
演示截图:
我是正则表达式的新手,我找不到一种方法来做我想做的事。让我解释。 我在 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 组:一个]
个字符。
演示截图: