【问题标题】:Does RegularExpressionValidator use other flavor than Regex?RegularExpressionValidator 是否使用正则表达式以外的其他风格?
【发布时间】:2008-12-04 07:05:47
【问题描述】:

我想初步检查输入的字符串是否类似于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 类支持。

现在我很感兴趣,为什么这两个 .NET 类使用不同的正则表达式风格?它在某处有记录吗?

【问题讨论】:

  • 我只是将链接直接放在我的答案中,而不是在 cmets 中“隐藏它们”。

标签: .net asp.net regex validation


【解决方案1】:

不是直接回答,只是一个明显的评论:

如果由于某种原因不支持字符类减法,您始终可以使用作为解决方法:

^[0-9A-HJ-NPR-Z]{17}$

记录我在这个问题的 cmets 中的内容:

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 博客条目中提到了该副作用的另一个说明(服务器端和客户端之间的不同正则表达式风格)。

【讨论】:

  • 恕我直言,这不是解决方法,这是唯一的方法。我不知道甚至存在“字符类减法”之类的东西。还是有一些非常奇怪的正则表达式风格?
  • 它确实,自 2004 年以来,在 .Net 正则表达式引擎中,但正如 msdn.microsoft.com/en-us/library/6xh899wy(VS.85).aspx 所指出的,javascript 客户端正则表达式验证器不知道“字符类减法”...
  • 正如msdn.microsoft.com/en-us/library/… 中提到的,在客户端,使用JScript 正则表达式语法。在服务器上,使用 System.Text.RegularExpressions..::.Regex 语法。 => 应该使用 JScript 正则表达式语法。
  • weblogs.asp.net/cosgood/archive/2003/05/06/6604.aspx 中提到了该副作用的另一个说明(服务器端和客户端之间的不同正则表达式风格)
【解决方案2】:

RegularExpressionValidator 还支持使用 JavaScript 的客户端验证,其中使用了 JavaScript Regex 引擎。您看到的区别是 JavaScript 和 .NET 正则表达式实现之间的区别。 您可以禁用客户端验证,从而强制验证器使用 .NET 正则表达式引擎,代价是额外的回发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 2011-05-16
    • 2011-04-17
    相关资源
    最近更新 更多