Я пытаюсь использовать C # для анализа текста с помощью регулярных выражений.
У меня есть следующий текст пример 1
Fn.If(first condition)
When the first condition is valid! This is a required section
Fn.ElseIf(some second condition)
When the second condition is valid! This is an optional section
Fn.ElseIf(third second condition)
When the third condition is valid! This is an optional section
Fn.Else
Catch all! This is an optional section
Fn.End
Я хочу иметь возможность разделить каждый раздел на 3 группы, чтобы конечный результат выглядел примерно так
- (группа 1A): Fn.If
- (группа 1B): первое условие
- (группа 1C): когда первое условие действительно! Это обязательный раздел
- (группа 2A): Fn.ElseIf
- (группа 2B): второе условие
- (группа 2C): если второе условие действительно! Это необязательный раздел
- (группа 3A): Fn.ElseIf
- (группа 3B): третье условие
- (группа 3C): когда действует третье условие! Это необязательный раздел
- (группа 4А): Fn.Else
- (группа 4В): поймать все! Это необязательный раздел
- (группа C): Fn.End
Как видно из комментариев, группа 1 (A / B / C) должна существовать вместе споследняя группа для шаблона, чтобы быть действительным. Однако все промежуточные группы являются необязательными, то есть они могут существовать или, возможно, не существовать.
В дополнение к приведенному выше текстовому примеру шаблон должен быть в состоянии проанализировать следующий текст example 2
Fn.If(first condition)
When first condition is valid! This is a required section
Fn.EndIf
или текст пример 3
Fn.If(first condition)
When first condition is valid! This is a required section
Fn.Else
Catch all! This is an optional section
Fn.EndIf
Я могу это сделать
(Fn\.If\s*)\((.+?)\)([\s\S]+)(Fn\.EndIf)
работает с примером текста 2 (Fn\.ElseIf\s*)\((.+?)\)([\s\S]+)
вернет Fn.ElseIf(...)....
группу (Fn\.Else)([\s\S]+)
захватит Fn.Else.....
групп
Однако я изо всех сил пытаюсь поставить все 3в шаблонах, которые можно объединить при идеализации этой строки 2, может быть ноль или более групп, за которыми следует одна или ни одной строки 3.
Я попробовал следующее, которое не работает. Чтобы было легче читать, я добавил новую строку после каждой группы только для вопроса.
(Fn\.If\s*)\((.+?)\)([\s\S]+)
((Fn\.ElseIf\s*)\((.+?)\)([\s\S]+))*
((Fn\.Else)([\s\S]+))?
(Fn\.EndIf)