I’m using a RegExp to validate some user input on an ASP.NET web page. It’s meant to enforce the construction of a password (i.e. between 8 and 20 long, at least one upper case character, at least one lower case character, at least one number, at least one of the characters #@!$% and no use of letters L or O (upper or lower) or numbers 0 and 1. This RegExp works fine in my tester (Expresso) and in my C# code.
This is how it looks:
(?-i)^(?=.{8,20})(?=.*[2-9])(?=.*[a-hj-km-np-z])(?=.*[A-HJ-KM-NP-Z]) (?=.*[#@!$%])[2-9a-hj-km-np-zA-HJ-KM-NP-Z#@!$%]*$
(Line break added for formatting)
However, when I run the code it lives in in IE6 or IE7 (haven’t tried other browsers as this is an internal app and we’re a Microsoft shop), I get a runtime error saying ‘Syntax error in regular expression’. That’s it – no further information in the error message aside from the line number.
What is it about this that JavaScript doesn’t like?
Well, there are two ways of defining a Regex in Javascript:
a. Through a Regexp object constructor:
b. Using a string literal:
You should also note that JS does not support some of the tenets of Regular Expressions. For a non-comprehensive list of features unsupported in JS, check out the regular-expressions.info site.
Specifically speaking, you appear to be setting some flags on the expression (for example, the case insensitive flag). I would suggest that you use the
/iflag (as indicated by the syntax above) instead of using(?-i)That would make your Regex as follows (Positive Lookahead appears to be supported):
For a very good article on the subject, check out Regular Expressions in JavaScript.
Edit (after Howard’s comment)
If you are simply assigning this Regex pattern to a RegularExpressionValidator control, then you will not have the ability to set Regex options (such as ignore case). Also, you will not be able to use the Regex literal syntax supported by Javascript. Therefore, the only option that remains is to make your pattern intrinsically case insensitive. For example,
[a-h]would have to be written as[A-Ha-h]. This would make your Regex quite long-winded, I’m sorry to say.Here is a solution to this problem, though I cannot vouch for it’s legitimacy. Some other options that come to mind may be to turn of Client side validation altogether and validate exclusively on the Server. This will give you access to the full Regex flavour implemented by the
System.Text.RegularExpressions.Regexobject. Alternatively, use a CustomValidator and create your own JS function which applies the Regex match using the patterns that I (and others) have suggested.