Я хочу небольшое регулярное выражение, которое принимает переменную (int, enum1, enum2) в C # - PullRequest
0 голосов
/ 10 ноября 2009

Я никогда раньше не имел дело с регулярными выражениями, и здесь я столкнулся с проблемой. Пользователь должен ввести текст, такой как Var1 (0, enum1, enum2), и я должен проверить синтаксис следующим образом: -

1 - убедитесь, что имя Var1 соответствует списку переменных, которые у меня есть .. Просто сравнение строк

2 - убедитесь, что параметры вводятся последовательно.

3 - удаление любого параметра разрешено. а также не допускается никаких параметров

тогда мне нужно взять параметры, чтобы заполнить какой-то объект

будет выполнять регулярное выражение для меня, или я должен пойти для написания парсера!?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 10 ноября 2009

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

Избавьте себя от головной боли и напишите синтаксический анализатор, его будет гораздо легче поддерживать, если вы повторно посетите код через пару месяцев.

0 голосов
/ 10 ноября 2009
^                           #Start of expression
(?<func> [^(]+ )            #All characters before the parenthesis
\(                          #The parenthesis
(        
   (?<param> [^,)]+ )    #A string that ends before the following , or )
   (,| \)$  )            #The following , or ). Make sure that ) only appears at end of line
)*                       #Repeat zero or more times
$                        #End of statement
(?<= \) )                #Make sure that last character was ) and not ,

Используйте инструкцию как есть с RegexOptions.IgnorePatternWhitespace. match.Groups ("func") содержит имя функции и match.Groups ("param"). Captures содержит захваченные параметры.

Для простоты проверьте действительные имена функций и параметры вне регулярного выражения.

0 голосов
/ 10 ноября 2009

Я бы не стал делать это с регулярным выражением, но вот то, что делает то, что вы хотите (я использую общий синтаксис регулярных выражений - ничего не зависит от C #).

Если предположить, что переменными являются var1, var2, var_3, а параметрами для параметра 1 являются par1_1, par1_2, а параметрами параметра 2 являются par2_1, par2_2, par2_3 и т. Д., То регулярное выражение будет:

(var_1|var_2|var_3)\(((par1_1|par1_2|par1_3),)?((par2_1|par2_2,)?((par3_1|par3_2)?\)

Обратите внимание, что:

  • (a | b | c) выбирает один из a, b или c
  • \ (и \) соответствуют круглым скобкам (обычная группа "(" и ")")
  • (...)? необязательно
  • После каждого необязательного блока параметров, кроме последнего, есть запятая.
0 голосов
/ 10 ноября 2009

Поскольку вам нужно проверить грамматику, моя внутренняя реакция будет такой: Это пахнет как парсер!

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