RegularExpression DataAnnotation测试字符串中的模式

时间:2016-10-13 05:40:49

标签: c# regex data-annotations

我对某个网站服务模型中的某个字段的数据验证有一些要求,我觉得Regex很合适,但我似乎无法撰写或找到我正在寻找的内容对于。

  1. 字符串必须是24个字母数字字符。
  2. 至少有8个角色必须是Alpha。
  3. 字符串的最后5个字符必须是数字。
  4.  [RegularExpression(@"^[\p{L}8\p{N}.(\d{5}5]+$")] 
    
     public string VIN { get; set; }
    

1 个答案:

答案 0 :(得分:2)

我知道你可以在正则表达式之外检查字符串长度,因此,为了教育目的,我将把字符串长度检查包含在下面的正则表达式中。

主要问题是您实际上编写的模式匹配[...]字符类中定义的1个或多个字符。 ^[\p{L}8\p{N}.(\d{5}5]+$匹配字符串的开头(^),然后是1个字符(字母(\p{L}),8,数字(\p{N}),{ {1}},.,再次为数字(但(},\d{5,再次为}),以及然后是字符串的结尾(5)。

您需要使用前瞻来施加限制:

$

或 - 如果您的字符串不能包含任意字符,只包含字母和数字:

@"^(?=.{24}$)(?=(?:\P{L}*\p{L}){8}).*\d{5}$" (server side)
@"^(?=.{24}$)(?=(?:[^A-Za-z]*[a-zA-Z]){8}).*[0-9]{5}$" (client/server side)

服务器/客户端之间的区别在于服务器端接受.NET正则表达式,因此支持Unicode,@"^(?=.{24}$)(?=(?:\P{L}*\p{L}){8})[\d\p{L}]*\d{5}$" (server side) @"^(?=.{24}$)(?=(?:[^A-Za-z]*[a-zA-Z]){8})[a-zA-Z0-9‌​]*[0-9]{5}$" (client/server side) 可以匹配所有Unicode数字,\d匹配任何Unicode字母,而客户端side只支持ECMAScript正则表达式,因此不支持Unicode。

详细信息(让我们检查最后一个服务器端模式):

  • \p{L} - 字符串开头
  • ^ - 整行的长度必须为24个字符(注意(?=.{24}$)与换行符不匹配)
  • . - 除了字母之外,必须至少有8个字母以及0 +字符
  • (?=(?:\P{L}*\p{L}){8}) - 0+位数或字母,尽可能多,但
  • [\d\p{L}]* - 5个数字(\d{5}$)必须位于字符串的末尾(\d{5})。