如果输入的字符串看起来像Vehicle Identification Number (VIN),我想进行初步检查。我知道它由17个字母和数字组成,但在VIN中不允许使用字母I,O和Q,所以我使用这个正则表达式:
^[0-9A-Z-[IOQ]]{17}$
现在,如果我使用RegularExpressionValidator检查类似1G1FP22PXS2100001的字符串,则会失败,但是使用此OnServerValidate事件处理程序的CustomValidator
Regex r = new Regex("^[0-9A-Z-[IOQ]]{17}$");
args.IsValid = r.IsMatch(TextBox1.Text);
运作良好。
实验显示了RegularExpressionValidator不支持Character Class Subtraction,但Regex类不支持。{/ p>
现在我感兴趣为什么这两个.NET类使用不同的正则表达式?它是否记录在案?
答案 0 :(得分:8)
不是一个直接的答案,而只是一个明显的评论:
如果由于某种原因不支持字符类减法,您始终可以将其用作解决方法:
^[0-9A-HJ-NPR-Z]{17}$
记录我在这个问题的评论中所写的内容:
文章 How to: Validate Against Patterns for ASP.NET Server Controls ,确实提到javascript客户端正则表达式验证程序不知道“字符类减法”
正如在 RegularExpressionValidator Class .Net documentation 中提到的那样:
除非浏览器不支持客户端验证或明确禁用客户端验证(通过将
EnableClientScript
属性设置为false),否则将执行服务器端验证和客户端验证。正则表达式验证实现在客户端上与在服务器上略有不同。在客户端上,使用JScript正则表达式语法 在服务器上,使用
System.Text.RegularExpressions..::.Regex
语法 JScript正则表达式语法是System.Text.RegularExpressions..::.Regex
语法的子集 因此,建议使用 JScript正则表达式语法,以便在客户端和服务器上产生相同的结果。
在RegularExpressionValidator woes博客条目中提到了这种副作用(服务器端和客户端之间的不同正则表达式)的另一个例子。
答案 1 :(得分:5)
RegularExpressionValidator还支持使用JavaScript的客户端验证,其中使用了JavaScript Regex引擎。您看到的差异是JavaScript和.NET正则表达式实现之间的区别。 您可以禁用客户端验证,从而强制验证器使用.NET正则表达式引擎,但需要额外的回发价格。