Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does RegularExpressionValidator use other flavor than Regex?

I want to do preliminary check if entered string looks like Vehicle Identification Number (VIN). I know what it consists of 17 letters and digits, but letters I, O and Q are not allowed inside VIN, so I use this regular expression:

^[0-9A-Z-[IOQ]]{17}$ 

Now if I check a string like 1G1FP22PXS2100001 with RegularExpressionValidator it fails, but CustomValidator with this OnServerValidate event handler

Regex r = new Regex("^[0-9A-Z-[IOQ]]{17}$");
args.IsValid = r.IsMatch(TextBox1.Text);

works well.

Experiments show what RegularExpressionValidator doesn't support Character Class Subtraction, but Regex class does.

Now I am interested why do these two .NET classes use different regex flavors? Is it documented somethere?

like image 711
Alexander Prokofyev Avatar asked Dec 04 '08 07:12

Alexander Prokofyev


2 Answers

Not a direct answer but just an obvious remark:

If for some reason Character class subtraction is not supported, you always can use as a workaround:

^[0-9A-HJ-NPR-Z]{17}$

To document what I put in the comments of this question:

The article How to: Validate Against Patterns for ASP.NET Server Controls, does mention that the javascript client-side regex validator does not know "character class subtraction"

As mentionned in RegularExpressionValidator Class .Net documentation:

Both server-side and client-side validation are performed unless the browser does not support client-side validation or client-side validation is explicitly disabled (by setting the EnableClientScript property to false).

The regular-expression validation implementation is slightly different on the client than on the server. On the client, JScript regular-expression syntax is used.
On the server, System.Text.RegularExpressions..::.Regex syntax is used.
JScript regular expression syntax is a subset of System.Text.RegularExpressions..::.Regex syntax.
It is therefore recommended that JScript regular-expression syntax should be used in order to yield the same results on both the client and the server.

Another illustration of that side-effect (different regex flavors between server and client sides) is mentionned in RegularExpressionValidator woes blog entry.

like image 131
VonC Avatar answered Sep 24 '22 18:09

VonC


The RegularExpressionValidator also supports client-side validation using JavaScript, where the JavaScript Regex engine is used. The difference you see is the difference between the JavaScript and the .NET regex implementation. You can disable client-side validation and thus force the validator to use the .NET regex engine, at the price of the additional post-back.

like image 33
csgero Avatar answered Sep 23 '22 18:09

csgero