对字符串中的模式进行regulareexpression DataAnnotation测试
本文关键字:regulareexpression DataAnnotation 测试 模式 字符串 | 更新日期: 2023-09-27 18:12:54
我对web服务中的一个模型中的字段进行数据验证有一些要求,我觉得Regex很适合,但我似乎无法编写或找到我正在寻找的内容。
- 字符串需要24个字母数字字符。
- 至少8个字符必须是Alpha。
- 字符串的最后5个字符必须是数字
[RegularExpression(@"^['p{L}8'p{N}.('d{5}5]+$")]
public string VIN { get; set; }
我看到你知道字符串长度可以在正则表达式之外检查,所以,我将把字符串长度检查包含在下面的正则表达式中,只是为了教育目的。
主要问题是,您实际上编写了一个匹配[...]
字符类中定义的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}
)必须位于字符串($
)的末尾。