ASP.net MVC regexp验证不起作用

时间:2011-05-13 12:20:04

标签: asp.net-mvc validation

我有一个包含许多验证规则的模型,除了旨在验证邮政编码的验证规则外,所有验证规则都正常工作。规则/属性定义如下:

        [Required(ErrorMessage="Postcode is required")]
        [StringLength(20, ErrorMessage="Postcode must be under 20 characters")]
        [RegularExpression(@"[A-Za-z]{1,2}[0-9R][0-9A-Z]?[ ]?[0-9][A-Za-z-[CIKMOVcikmov]]{2}", ErrorMessage="Postcode is not valid")]
        public string Postcode { get; set; }

每次邮政编码未通过RegEx验证时,即使在在线测试仪中使用相同的RegEx(例如http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx)也会通过。应该通过的英国邮政编码的几个例子是IP4 4DL和bn35fb

2 个答案:

答案 0 :(得分:0)

我已经运行了这个测试

 var attr = new RegularExpressionAttribute(@"[A-Za-z]{1,2}[0-9R][0-9A-Z]?[ ]?[0-9][A-Za-z-[CIKMOVcikmov]]{2}");
 Assert.IsTrue(attr.IsValid("IP4 4DL"));

它似乎工作正常。

我唯一的建议是检查传入邮政编码的任何一侧是否有空格。

答案 1 :(得分:0)

一些注意事项:

  • 您没有为[0-9R]组中的R或空格前的最终[0-9A-Z]字符提供小写选项。除非您使用“忽略大小写”选项,否则这些选项仅匹配大写项目。如果您使用的是Ignore Case,那么所有其他小写范围都是不必要的。
  • 空格周围的括号是可选的。的?运算符与前一个字符匹配,因此只有在集合中有多个字符时才需要括号。
  • 我上面提到的语法不是标准的。我已经使用正则表达10年了,我从来没有见过这样的东西。它“工作”,取决于您的解析器,但甚至没有在.NET解析器中记录它的工作原理。请注意,它完全失败 - 它甚至不能正确解析正则表达式,更不用说在Javascript中找到任何匹配项。应该全面支持的最佳方式是使用[ABD-HJLNP-UW-Zabd-hjlnp-uw-z]代替。在RegexPal有一个Javascript正则表达式测试器,我确认你的表达式在那里失败了,但是这个简单的改变就成功了。
  • 与上一个相关,您尚未指出验证实际发生的位置。如果您正在使用客户端验证器,它实际上是在Javascript中运行它,而不是.NET。这无疑可以解释为什么它在这个表达方面失败了。

TL; DR:尝试替换最终的字符模式,看它是否开始工作。