使用正则表达式在嵌套括号外查找匹配项

Posted

技术标签:

【中文标题】使用正则表达式在嵌套括号外查找匹配项【英文标题】:Find a match outside nested brackets with Regex 【发布时间】:2021-10-15 19:47:15 【问题描述】:

我需要找到所有出现在括号外的 AND 单词。我已经从 SO 测试了一堆解决方案,但找不到任何适用于嵌套括号的解决方案。

应该找到这些 AND:

text AND text AND [ text AND text [ AND text [ text AND text ] text ] ] text AND text
     ^^^      ^^^                                                            ^^^

我最好的尝试是使用这种模式AND(?![^[]*\]),它可以正常工作,直到有嵌套的括号

text AND text AND [ text AND text ] text AND text

【问题讨论】:

正则表达式在哪里使用?并非每个正则表达式都支持匹配嵌套括号。 您在这里使用哪种编程语言? 我在 C# 上编码,在 regex101.com 上测试 这是您的第一个错误:regex101 不支持 .NET 正则表达式。无论你在那里尝试什么都行不通。你用火柴做什么?更换?提取?分裂? @WiktorStribiżew 拆分 【参考方案1】:

.Net Regex 能够使用平衡模式映射。允许我们做的是将开始锚点匹配到相应的结束锚点。 .Net Regex 使用 pushpop 的操作,这些操作是使用命名匹配捕获完成的。因此,将初始匹配捕获命名为标准(?<NameHere> ),并使用名称中的- 进行弹出。如?<-NameHere> )

链接操作没有犯罪行为,我会将其设为多部分正则表达式场景。

    提取前后的文本。 计算前后文本中的 Ands。

对于第一步,我将把前面的文本放在命名匹配捕获“Pre”中,将下面的文本放在“Post”中。

这是使用平衡模式匹配的正则表达式。此模式需要IgnorePatternWhitespace,它允许对该模式进行评论。另外为了使其可读,我将对[] 使用十六进制值表示,因为它们是正则表达式模式的特殊字符。

var data = "AAA AND BBB AND [ EEE AND FFF [ AND GGG [ HHH AND III ] JJJ ] ] YYY AND ZZZ";

var pattern = @"
# 5B [ Opening bracket
# 5D ] Closing bracket

^                  # Anchor to beginning of the string.
(?<Pre>[^\x5B]+)   # Get the initial text before the first brace.
  (?<Brace>\x5B)   # Push the initial brace
    .+             # Extract all (including sub braces)
  (?<-Brace>\x5D)  # Pop the matching closing brace to the initial brace
(?<Post>.+)        # Get the follow-on text.
";

var mainMatch = Regex.Match(data, pattern, RegexOptions.IgnorePatternWhitespace);  

var totalAnds = Regex.Matches(mainMatch.Groups["Pre"].Value, "AND").Count
                  + Regex.Matches(mainMatch.Groups["Post"].Value, "AND").Count;

Console.WriteLine($"There are totalAnds Ands");

结果是There are 3 Ands

【讨论】:

这个超级有用!回复的很详细,谢谢!这几乎就是我正在寻找的,我将尝试解决它以使其与多个***括号一起使用。如AAA AND BBB [ EEE AND FFF [ AND GGG ] JJJ AND ] CCC AND HHH [ EEE AND FFF [ AND GGG ] JJJ ] ZZZ AND

以上是关于使用正则表达式在嵌套括号外查找匹配项的主要内容,如果未能解决你的问题,请参考以下文章

C# 正则表达式 - 为括号内的单个模式查找一个或多个匹配项

在最外圆括号内查找字符串

用于捕获嵌套括号中的值的正则表达式

用于匹配嵌套括号内的特定文本的 C# 正则表达式

由于未知错误,嵌套括号的动态正则表达式失败

正则表达式 小括号导致匹配项重复