正则表达式数据注释测试字符串中的模式

RegularExpression DataAnnotation testing for patterns in a string

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

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

 [RegularExpression(@"^[\p{L}8\p{N}.(\d{5}5]+$")] 

 public string VIN { get; set; }

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

主要问题是您实际上编写了一个匹配 [...] 字符 class 中定义的 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)

server/client端的区别在于服务器端接受.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}) 必须位于字符串的末尾 ($)。