RegularExpressionValidator是否使用除Regex之外的其他风味?

时间:2008-12-04 07:05:47

标签: .net asp.net regex validation

如果输入的字符串看起来像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类使用不同的正则表达式?它是否记录在案?

2 个答案:

答案 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正则表达式引擎,但需要额外的回发价格。