aba*_*hev 4 .net regex asp.net validation
RegularExpressionValidator.ValidationExpression="\d{10}" 仅表示数字 - 最多10个
RegularExpressionValidator.ValidationExpression="\d{10,12}" 仅表示数字 - 10,11或12.
如何强制严格10或12个符号?
一种方法是:
"\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以避免担心术语的顺序.
| 归档时间: |
|
| 查看次数: |
12148 次 |
| 最近记录: |