RegularExpressionValidator.ValidationExpression强制长度为10或12个符号

aba*_*hev 4 .net regex asp.net validation

RegularExpressionValidator.ValidationExpression="\d{10}" 仅表示数字 - 最多10个

RegularExpressionValidator.ValidationExpression="\d{10,12}" 仅表示数字 - 10,11或12.

如何强制严格10或12个符号?

Mar*_*ers 7

一种方法是:

"\d{10}(\d{2})?"
Run Code Online (Sandbox Code Playgroud)

或者你可以更明确一点,代价是一点点表现:

"^(\d{10}|\d{12})$"
Run Code Online (Sandbox Code Playgroud)

这里描述了第二个表达式中锚点的原因:

如果您遇到模式匹配结构的问题,请尝试使用"^("和")$"包装表达式.例如,"a | ab"变为"^(a | ab)$".


更新

我感兴趣的是为什么\d{10}|\d{12}不能正常工作,并决定深入了解验证器的源代码,看看为什么会失败.

RegularExpressionValidator使用相同的正则表达式和在的情况下,既证明了服务器端和客户端\d{10}|\d{12}失败在客户端为长度12,但是适用于长度10的源代码揭示匹配是如何制造:

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

请注意,这个正则表达式是A|B但如果A匹配,则从未检查过B - 正则表达式对管道操作不是"贪婪" - 它会找到它找到的第一个匹配项.因此,匹配此正则表达式的结果是即使您输入12位数字,十位数匹配也会成功.但是测试value == matches[0]失败了,因为匹配不是完整的字符串.

交换术语的顺序,即写入\d{12}|\d{10},确实有效,因为首先测试较长的匹配,并且仅在长匹配失败时测试较短的匹配.

获得的经验:在使用管道时明确使用锚点是一个好主意,RegularExpressionValidator以避免担心术语的顺序.


Nic*_*ume 5

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

^$如果你想要精确的10或12位数,这两个是很重要的.

顺便说一句,如果你正在制作很多regexp这个网站很棒:http://rubular.com/

玩得开心