开发者

RegularExpressionValidator.ValidationExpression to force length in 10 or 12 symbols

RegularExpressionValidator.ValidationEx开发者_运维技巧pression="\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?


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.


^\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


Use the regular expression "pipe"

RegularExpressionValidator.ValidationExpression = "\d{10}|\d{12}"


\d{10}(?:\d{2}){0,1}

should match 10 digits or 10+2 digits. the (?:.....) part is a non capturing group

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜