Регулярное выражение .NET для определения `if .. then .. else .. endif` - PullRequest
3 голосов
/ 05 сентября 2010

Мне нужно два регулярных выражения для идентификации if .. then .. else .. endif секции и их частей.

Из выражения, которое может быть таким, как показано ниже:

Пример 1:

5 + 10 * (if (4 + 4.5) > 0 then 20 else 45 endif) + 2

Пример 2:

if (20 == 10) then 10 endif

Пример 3:

if (20/10 != 2) then (2 * 10) else (3 * 4) endif

Ожидаемый результат:

  1. Регулярное выражение, которое может дать мне if..endif часть в выражении For ex.из примера 1 я должен получить if (4 + 4.5) > 0 then 20 else 45 endif отдельно

  2. регулярное выражение, которое может дать мне if..endif частей.Напримериз примера 1 я должен получить:

левый компаратор: (4 + 4.5)
оператор: >
правый компаратор: 0
ThenPart: 20
ElsePart: 45 (может быть нулевым или строковым. Пусто)

Указывает на примечание:

  1. else необязательно.
  2. if..endif может быть единственным выражением или частью выражения.
  3. then & else может иметь выражение или статическое значение.
  4. Условные операторы, которые могутиспользоваться, если условие >, <, ==, !=, >=, <=
  5. Регулярное выражение должно работать в приложении C # .

Ответы [ 2 ]

4 голосов
/ 05 сентября 2010

Регулярные выражения плохо подходят для такой работы, потому что вы можете делать вложенные if / then / else и из-за возможных изменений (например, отсутствие else);Регулярное выражение будет огромным, и потребуется много работы, чтобы сбалансировать жадность / лень каждого захвата.Было бы намного проще отсканировать каждый символ и создать дерево выражений, которое вы могли бы затем интерпретировать.Регулярные выражения больше подходят для разбора текста в тех случаях, когда формат известен или где есть небольшие различия.

РЕДАКТИРОВАТЬ

Подумав об этом, это было не так сложно:

if( *.*? *)then( *.*? *)(?:else( *.*? *))?endif

Каждая группа захвата содержит компоненты:

  1. Условие
  2. Значение для true
  3. Значение дляfalse (только при наличии else)

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

1 голос
/ 05 сентября 2010

Почему вы думаете, что вам нужно регулярное выражение? В таком случае я написал бы небольшой анализатор, например, используя ANTLR . Поддержание грамматики синтаксического анализатора для сложных выражений обычно менее болезненно, чем регулярных выражений, с дополнительным преимуществом предоставления улучшенных сообщений об ошибках с контекстной информацией и т. П.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...