Regex 正则表达式是否仅删除特定嵌套级别的括号中的文本?
我目前正在努力寻找一个.NET正则表达式,它只在括号位于嵌套级别2时删除括号中的给定文本 下面是一个多行的示例字符串来解释问题:Regex 正则表达式是否仅删除特定嵌套级别的括号中的文本?,regex,powershell,nested,brackets,Regex,Powershell,Nested,Brackets,我目前正在努力寻找一个.NET正则表达式,它只在括号位于嵌套级别2时删除括号中的给定文本 下面是一个多行的示例字符串来解释问题: ( (text (bingo) <-- keep this (level=3) text) (text) (bingo) <-- kick this (level=2) (text) ) ( (文本) (宾果)您的问题暗示这是一个多行字符串,在这种情况下,我建议将其拆分为一个字
(
(text
(bingo) <-- keep this (level=3)
text)
(text)
(bingo) <-- kick this (level=2)
(text)
)
(
(文本)
(宾果)您的问题暗示这是一个多行字符串,在这种情况下,我建议将其拆分为一个字符串数组,如下所示:
$StringArray = $StringVar -split “`n”
在这一点之后,您可以遍历此数组,并一次处理一行,如下所示:
ForEach($String in $StringArray) {
$Match = [RegEx]::Match($String, "^ \(.*\)")
if($Match.Success) {
$KeepStrings += $String
}
}
对于组合和undertsand RegEx字符串,我建议使用类似以下表达式的Maybe:
^\s{4}\(bingo\).*\s
而替换一个空字符串可能就快成功了
如果您希望探索/简化/修改该表达式,它已被删除
在的右上面板上进行了说明
.如果你愿意,你可以
也可以观看,它将如何匹配
对照一些样本输入
您可以通过跟踪括号(方括号)嵌套级别的有状态回调来解决此问题:
上述收益率:
(
(文本)
(宾果)
(文本)
(文本)
(文本)
)
注:
- 只匹配准确的字符串
(宾果)
- 只有匹配的字符串本身(如果在请求的级别)被删除(而不是整行)
那么…(文本(宾果)文本)呢…
?虽然叶是第3级,但完整的父/子级实际上也是第2级。如果要排除此项,则应使用以下内容细化定义:…除非它包含任何子项。您确实需要为此使用正则表达式?请参阅。我同意@SimonLink您不能使用正则表达式,您需要一个解析器。简单的链接到的解析器将起作用。我在上面的示例中添加了换行符和空格,只是为了让问题更清楚。在最初的场景中,它都在一行中,没有任何制表符/空格。
$txt = @'
(
(text
(bingo)
text)
(text)
(bingo)
(text)
)
'@
$level = 1
[regex]::Replace($txt, '\((bingo\))?|\)', {
param($m) # the match at hand
if ($m.Value -eq ')') { # ')' -> decrease level
([ref] $level).Value--
$m.Value
}
elseif ($m.Groups[1].Value) { # '(bingo)'
if (([ref] $level).Value -eq 2) { # remove
''
} else { # keep
$m.Value
}
}
else { # '(' -> increase level
([ref] $level).Value++
$m.Value
}
})