捕获外部 paren 组而忽略内部 paren 组

Capture outer paren groups while ignoring inner paren groups

我正在使用 C# 和正则表达式,尝试捕获外部括号组而忽略内部括号组。我有遗留生成的文本文件,其中包含数以千计的字符串结构,如下所示:

([txtData] of COMPOSITE
(dirty FALSE)
(composite [txtModel])
(view [star3])
(creationIndex 0)
(creationProps )
(instanceNameSpecified FALSE)
(containsObject nil)
(sName txtData)
(txtDynamic FALSE)
(txtSubComposites )
(txtSubObjects )
(txtSubConnections )
)

([txtUI] of COMPOSITE
(dirty FALSE)
(composite [txtModel])
(view [star2])
(creationIndex 0)
(creationProps )
(instanceNameSpecified FALSE)
(containsObject nil)
(sName ApplicationWindow)
(txtDynamic FALSE)
(txtSubComposites )
(txtSubObjects )
(txtSubConnections )
)

([star38] of COMPOSITE
(dirty FALSE)
(composite [txtUI])
(view [star39])
(creationIndex 26)
(creationProps composite [txtUI] sName Bestellblatt)
(instanceNameSpecified TRUE)
(containsObject COMPOSITE)
(sName Bestellblatt)
(txtDynamic FALSE)
(txtSubComposites )
(txtSubObjects )
(txtSubConnections )
)

我正在寻找一个可以捕获上面示例中的 3 个分组的正则表达式,这是我目前已经尝试过的方法:

Regex regex = new Regex(@"\((.*?)\)");
return regex.Matches(str);

上面正则表达式的问题在于它找到了内部括号分组,例如 dirty FALSEcomposite [txtModel]。但我希望它匹配的是每个外部分组,例如上面显示的 3 个。 外分组的定义很简单:

  1. 左括号是文件中的第一个字符,或者它跟在换行符 and/or 回车 return.
  2. 之后
  3. 右括号是文件中的最后一个字符,或者后跟换行符或回车符 return。

我希望正则表达式模式忽略所有不遵守上面数字 1 和 2 的双亲分组。我所说的“忽略”是指不应将它们视为匹配项 - 但应将它们 return 编辑为外部分组匹配项的一部分。

因此,为了满足我的 objective,当我的 C# 正则表达式与上面的示例运行时,我应该取回恰好有 3 个匹配项的正则表达式 MatchCollection,如上所示。

怎么做到的?

您可以通过Balancing Groups实现。

这里有一个匹配外括号的演示。

string sentence = @"([txtData] of COM ..."; // your text

string pattern = @"\((?>\((?<c>)|[^()]+|\)(?<-c>))*(?(c)(?!))\)";
Regex rgx = new Regex(pattern);

foreach (Match match in rgx.Matches(sentence))
{
    Console.WriteLine(match.Value);
    Console.WriteLine("--------");
}