tags:

views:

28

answers:

3

Consider the below

Case 1: SDN#(X,)

Case 2: SDN#(X,12)

Case 3: SDN#(34,12)

Case 4: CORR#(X,,)

Case 5: CORR#(X,12,45)

Case 6: CFH#(X,AVG)

These all are some kind of custom functions.

How can I build a regular expression that will identity that the given text satisfies the function requirement

The generalised structure is as <FUNCTION NAME>#(arg1,[arg2],[agr3]....)

e.g. given CORR, or CORR#() it is not a funciton.

Because every function must have atleast one argument(which will be alphanumeric).

My approach so far is

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");

But it is not working

I am using C#3.0

Thanks

A: 

Here's an attempt (even if I don't know if its working in C#):

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

Explanation: using CORR#(arg1, arg2, arg3)

[A-Z]+# matches the function name, here CORR#

\( matches the opening parentheses (. Note that I escaped the ( in order to tell the engine not to take it as a grouping construct.

([A-Za-z0-0]+,?)* matches arg1, arg2,. Note that it's a bit hacky because of the ,? which indicates that there might be a , at the end, but it is not necessary.

,* matches "empty commata".

\) matches the closing parentheses. Note that I escaped the ) in order to tell the engine not to take it as a grouping construct.

phimuemue
priyanka.sarkar_2
A: 

If you have meaningless spaces in your regex (like you have), you have to specify IgnorePatternWhitespace for the RegexOptions.

leppie
+1  A: 

I don't know specificaly C# regex flavor, but this one works in PCRE for all your cases :

/^[A-Z]+#\(([a-zA-Z0-9]*,?)*\)$/
M42