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
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.
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.