【问题标题】:RegularExpression DataAnnotation testing for patterns in a string正则表达式 DataAnnotation 测试字符串中的模式
【发布时间】:2016-10-13 05:40:48
【问题描述】:

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

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

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

 public string VIN { get; set; }

【问题讨论】:

  • 试试@"^(?=.{24}$)(?=(?:\P{L}*\p{L}){8}).*\d{5}$"
  • 字符串限制也可以用[StringLength(24)]属性来设置。然后,正则表达式将是 [RegularExpression(@"^(?=(?:\P{L}*\p{L}){8}).*\d{5}$")][RegularExpression(@"^(?=(?:\P{L}*\p{L}){8})[\p{L}\p{N}]*\p{N}{5}$")]
  • 如果模式也应该在客户端工作,你需要使用[StringLength(24)][RegularExpression("^(?=(?:[^A-Za-z]*[a-zA-Z]){8})[a-zA-Z0-9]*[0-9]{5}$")]之类的东西(或者如果你需要在模式中使用字符串长度,"^(?=.{24}$)(?=(?:[^A-Za-z]*[a-zA-Z]){8})[a-zA-Z0-9‌​]*[0-9]{5}$") .
  • @WiktorStribiżew 我使用了 [StringLength(24, MinimumLength = 24, ErrorMessage = "Invalid Length")] 作为长度。我不确定在单独的注释下还是在正则表达式注释中覆盖长度更好。
  • 那么正则表达式呢?我的任何建议对你有用吗?

标签: c# regex data-annotations


【解决方案1】:

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

主要问题是您实际上编写了一个匹配 [...] 字符类中定义的 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}) 必须位于字符串的末尾 ($)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2019-11-09
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多