如果输入的字符串看起来像车辆识别号码(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不支持字符类减法,但Regex类支持.
现在我感兴趣为什么这两个.NET类使用不同的正则表达式?它是否记录在案?
不是一个直接的答案,只是一个明显的评论:
如果由于某种原因不支持Character类减法,您始终可以使用它作为变通方法:
^[0-9A-HJ-NPR-Z]{17}$
记录我在这个问题的评论中的内容:
文章如何:验证ASP.NET服务器控件的模式,确实提到javascript客户端正则表达式验证器不知道"字符类减法"
正如在RegularExpressionValidator Class .Net文档中提到的那样:
除非浏览器不支持客户端验证或明确禁用客户端验证(通过将
EnableClientScript
属性设置为false),否则将执行服务器端和客户端验证.正则表达式验证实现在客户端上与在服务器上略有不同.在客户端上,使用JScript正则表达式语法.
在服务器上,使用System.Text.RegularExpressions..::.Regex
语法.
JScript的正则表达式语法的一个子集System.Text.RegularExpressions..::.Regex
语法.
因此,建议使用JScript正则表达式语法,以便在客户端和服务器上产生相同的结果.
在RegularExpressionValidator的博客条目中提到了这种副作用(服务器端和客户端之间的不同正则表达式)的另一个例子.
RegularExpressionValidator还支持使用JavaScript的客户端验证,其中使用了JavaScript Regex引擎.您看到的差异是JavaScript和.NET正则表达式实现之间的区别.您可以禁用客户端验证,从而强制验证器使用.NET正则表达式引擎,但需要额外的回复.