使用正则表达式和下推自动机匹配嵌套括号的组

4

我正在处理一个C#正则表达式,它可以匹配嵌套结构(在这种情况下是括号)以及任意运算符(在这种情况下是'|'字符)。

我已经开始使用一个下推自动机,如这里所描述的。

目前为止,我有:

String pattern = @"
(?# line 01) \(
(?# line 02) (?>
(?# line 03) \( (?<DEPTH>)
(?# line 04) |
(?# line 05) \) (?<-DEPTH>)
(?# line 06) |
(?# line 07) .?
(?# line 08) )*
(?# line 09) (?(DEPTH)(?!))
(?# line 10) \)
";

var source = "((Name1| Name2) Blah) | (Name3 ( Blah | Blah))";

var matches = Regex.Matches(source, pattern,
  RegexOptions.IgnorePatternWhitespace);
matches.Dump();

产生以下结果:
// ((Name1| Name2) Blah)
// (Name3 ( Blah | Blah))

期望的结果:

// ((Name1| Name2) Blah)
// |
// (Name3 ( Blah | Blah))

注意:在这些组之间可能有运算符,也可能没有。例如,源代码可能看起来像“((Name1| Name2) Blah) (Name3 ( Blah | Blah))”。


1
正则表达式不是一个好的选择。我建议你自己解析它或使用解析库。这是假设你的嵌套括号结构可能比你给出的更复杂。 - Simon Whitehead
@SimonWhitehead 是的,我知道解析器是更好的可维护性选择。我计划使用Antlr来实现更长久的解决方案。感谢您的建议! - Tim Capps
1个回答

3
你可以尝试这样做:(只需在末尾添加 |\|
\((?>\((?<DEPTH>)|\)(?<-DEPTH>)|.?)*(?(DEPTH)(?!))\)|\|

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接