Regex 正则表达式是否仅删除特定嵌套级别的括号中的文本?

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) ) ( (文本) (宾果)您的问题暗示这是一个多行字符串,在这种情况下,我建议将其拆分为一个字

我目前正在努力寻找一个.NET正则表达式,它只在括号位于嵌套级别2时删除括号中的给定文本

下面是一个多行的示例字符串来解释问题:

(
    (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
    }
})