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?
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 ofSystem.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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With