我对某个网站服务模型中的某个字段的数据验证有一些要求,我觉得Regex很合适,但我似乎无法撰写或找到我正在寻找的内容对于。
[RegularExpression(@"^[\p{L}8\p{N}.(\d{5}5]+$")]
public string VIN { get; set; }
答案 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}
)。