2013-06-19 38 views
4

我正在處理一個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)) 

注:有可能會或可能不會有任何運營商之間的團體。例如,源可能看起來像 「((名稱1 |名稱2)布拉赫)(NAME3(布拉赫|布拉赫))」

+1

正則表達式不適合這個。我建議你自己解析它或使用解析庫。也就是說,假設你的嵌套括號結構可能比你給出的更復雜。 –

+0

@SimonWhitehead是的,我意識到解析器是更好的維護方法。我打算使用Antlr作爲更常見的解決方案。謝謝您的意見! –

回答

3

你可以試試這個:(只是在末尾添加|\|

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

工作。非常感謝! –