Я работаю над регулярным выражением 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 (Л | Л))"
Regex не подходит для этого. Я бы предложил разбор его самостоятельно или с помощью библиотеки синтаксического анализа. То есть, если ваша структура вложенных скобок может быть более сложной, чем то, что вы дали. –
@SimonWhitehead Да, я знаю, что синтаксический анализатор лучше всего подходит для ремонтопригодности. Я планирую использовать Antlr для более постоянного решения. Спасибо за ваш вклад! –