2013-06-19 3 views
4

Я работаю над регулярным выражением C#, которое может соответствовать вложенным конструкциям (в этом случае круглые скобки), а также произвольным операторам (в этом случае символ «|»).Соответствующие группы вложенных круглых скобок с использованием Regex и Pushdown-Automata

Я начал работу с использования push-down automata, как описано 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) Л) (name3 (Л | Л))"

+1

Regex не подходит для этого. Я бы предложил разбор его самостоятельно или с помощью библиотеки синтаксического анализа. То есть, если ваша структура вложенных скобок может быть более сложной, чем то, что вы дали. –

+0

@SimonWhitehead Да, я знаю, что синтаксический анализатор лучше всего подходит для ремонтопригодности. Я планирую использовать Antlr для более постоянного решения. Спасибо за ваш вклад! –

ответ

3

Вы можете попробовать это: (просто добавив |\| в конце)

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

Это сработало. Спасибо! –