Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RegularExpressionValidator.ValidationExpression to force length in 10 or 12 symbols

RegularExpressionValidator.ValidationExpression="\d{10}" means only digits - 10 max.

RegularExpressionValidator.ValidationExpression="\d{10,12}" means only digits - 10, 11 or 12.

How to force strictly 10 or 12 symbols?

like image 374
abatishchev Avatar asked Dec 08 '22 04:12

abatishchev


2 Answers

One way is:

"\d{10}(\d{2})?"

Or you could be more explicit, at the cost of a little performance:

"^(\d{10}|\d{12})$"

The reason for the anchors in the second expression is described here:

If you experience problems with pattern-matching constructs, try wrapping the expression with "^(" and ")$". For example, "a|ab" becomes "^(a|ab)$".


Update

I was interested in why \d{10}|\d{12} did not work correctly, and decided to dip into the source code for the validator to see why this fails.

The RegularExpressionValidator validates both server-side and client-side using the same regular expression and in the case of \d{10}|\d{12} it fails on the client-side for length 12, but works for length 10. The source-code reveals how the match is made:

var rx = new RegExp(val.validationexpression);
var matches = rx.exec(value);
return (matches != null && value == matches[0]);

Note that this regular expression is A|B but if A matches, B is never even checked - the regular expression is not "greedy" over the pipe operation - it takes the first match it finds. So the result of matching this regular expression is that the ten digit match succeeds even if you give a 12 digit input. But then the test value == matches[0] fails because the match is not the full string.

Swapping the order of the terms, i.e. writing \d{12}|\d{10}, does work because the longer match is tested first, and the shorter match is only tested if the long match fails.

Lesson learned: it is a good idea to explicitly use anchors when using the pipe in RegularExpressionValidator to avoid having to worry about the order of the terms.

like image 153
Mark Byers Avatar answered Apr 27 '23 16:04

Mark Byers


^\d{10}$|^\d{12}$

The two ^$ are important if you want an exact 10 or 12 digits.

By the way, If you are making a lot of regexp this website is great : http://rubular.com/

Have fun

like image 33
Nicolas Guillaume Avatar answered Apr 27 '23 17:04

Nicolas Guillaume