使用正则表达式在嵌套括号外查找匹配项
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 使用 push 和 pop 的操作,这些操作是使用命名匹配捕获完成的。因此,将初始匹配捕获命名为标准(?<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
以上是关于使用正则表达式在嵌套括号外查找匹配项的主要内容,如果未能解决你的问题,请参考以下文章