Регулярное выражение для определения функции, общий тип которой# (Arg1 [arg2], [agr3] ....) - PullRequest
0 голосов
/ 23 августа 2010

Рассмотрим ниже

Случай 1: SDN#(X,)

Случай 2: SDN#(X,12)

Дело 3: SDN#(34,12)

Дело 4: CORR#(X,,)

Дело 5: CORR#(X,12,45)

Случай 6: CFH#(X,AVG)

Это все какие-то пользовательские функции.

Как создать регулярное выражение, которое будет идентифицировать то, что удовлетворяет данный тексттребование к функции

Обобщенная структура имеет вид # (arg1, [arg2], [agr3] ....)

например, с учетом CORR или CORR # () это не функция.

Потому что каждая функция должна иметь по крайней мере один аргумент (который будет буквенно-цифровым).

Мой подход пока что

Regex r = new Regex(@"([A-Z]+)[#]([A-Z a-z 0-9]+),([A-Z a-z 0-9]+),([A-Z a-z 0-9]+)");
Match m = r.Match(txtFunction.Text);
if (m.Success) MessageBox.Show("OK");
else MessageBox.Show("Not OK");

Но он не работает

Я использую C # 3.0

Спасибо

Ответы [ 3 ]

0 голосов
/ 23 августа 2010

Если у вас есть бессмысленные пробелы в регулярном выражении (как и у вас), вы должны указать IgnorePatternWhitespace для RegexOptions.

0 голосов
/ 23 августа 2010

Я не знаю специфики C # regex, но этот работает в PCRE для всех ваших случаев:

/^[A-Z]+#\(([a-zA-Z0-9]*,?)*\)$/
0 голосов
/ 23 августа 2010

Вот попытка (даже если я не знаю, работает ли она в C #):

[A-Z]+#\(([A-Za-z0-9]+,?)*,*\)

Объяснение: использование CORR#(arg1, arg2, arg3)

[A-Z]+# соответствует названию функции, здесь CORR#

\( соответствует открывающим скобкам (. Обратите внимание, что я избежал (, чтобы сказать движку не принимать его как конструкцию группировки.

([A-Za-z0-0]+,?)* соответствует arg1, arg2,. Обратите внимание, что это немного странно из-за ,?, который указывает, что в конце может быть ,, но это не обязательно.

,* соответствует "пустым запятым".

\) соответствует закрывающим скобкам. Обратите внимание, что я избежал ), чтобы сказать двигателю не принимать его как конструкцию группировки.

...