Регулярные выражения плохо подходят для такой работы, потому что вы можете делать вложенные if
/ then
/ else
и из-за возможных изменений (например, отсутствие else
);Регулярное выражение будет огромным, и потребуется много работы, чтобы сбалансировать жадность / лень каждого захвата.Было бы намного проще отсканировать каждый символ и создать дерево выражений, которое вы могли бы затем интерпретировать.Регулярные выражения больше подходят для разбора текста в тех случаях, когда формат известен или где есть небольшие различия.
РЕДАКТИРОВАТЬ
Подумав об этом, это было не так сложно:
if( *.*? *)then( *.*? *)(?:else( *.*? *))?endif
Каждая группа захвата содержит компоненты:
- Условие
- Значение для true
- Значение дляfalse (только при наличии
else
)
Я не даю никаких гарантий точности, поскольку он не работает с вложенными if
выражениями, но для ваших нужд этого должно быть достаточно.