使用Regex和Pushdown-Automata匹配嵌套括号的组

时间:2013-06-19 22:15:20

标签: c# regex pushdown-automaton

我正在研究一个c#正则表达式,它可以匹配嵌套结构(在本例中为括号)以及任意运算符(在这种情况下为'|'字符)。

我已经开始使用按下here所述的下推自动机。

到目前为止我所拥有的:

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 个答案:

答案 0 :(得分:3)

你可以试试这个:(最后只添加|\|

\((?>\((?<DEPTH>)|\)(?<-DEPTH>)|.?)*(?(DEPTH)(?!))\)|\|