对字符串中的模式进行regulareexpression DataAnnotation测试

本文关键字:regulareexpression DataAnnotation 测试 模式 字符串 | 更新日期: 2023-09-27 18:12:54

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

  1. 字符串需要24个字母数字字符。
  2. 至少8个字符必须是Alpha。
  3. 字符串的最后5个字符必须是数字

 [RegularExpression(@"^['p{L}8'p{N}.('d{5}5]+$")] 
 public string VIN { get; set; }

对字符串中的模式进行regulareexpression DataAnnotation测试

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

主要问题是,您实际上编写了一个匹配[...]字符类中定义的1个或多个字符的模式。^['p{L}8'p{N}.('d{5}5]+$匹配字符串的开头(^),然后是1+字符(字母('p{L}), 8,数字('p{N}), ., (,再次是数字(但有'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)

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

@"^(?=.{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)

服务器端/客户端之间的区别在于服务器端接受。net正则表达式,因此是Unicode感知的,'d可以匹配所有Unicode数字,'p{L}可以匹配任何Unicode字母,而客户端只支持ECMAScript正则表达式,因此不是Unicode感知的。

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

  • ^ -字符串
  • 起始
  • (?=.{24}$) -整行长度必须是24个字符(注意.不匹配换行符)
  • (?=(?:'P{L}*'p{L}){8}) -必须至少有8个字母前面有0+字符,而不是字母
  • ['d'p{L}]* - 0+数字或字母,尽可能多,但
  • 'd{5}$—5位数字('d{5})必须位于字符串($)的末尾。
相关文章:
  • 没有找到相关文章