正则表达式数据注释测试字符串中的模式
RegularExpression DataAnnotation testing for patterns in a string
我对 Web 服务中我的一个模型中的某个字段的数据验证有一些要求,我觉得 Regex 很合适,但我似乎无法编写或找到我正在寻找的内容。
- 字符串必须是 24 个字母数字字符。
- 至少有 8 个字符必须是字母。
- 字符串的最后 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}
) 必须位于字符串的末尾 ($
)。
我对 Web 服务中我的一个模型中的某个字段的数据验证有一些要求,我觉得 Regex 很合适,但我似乎无法编写或找到我正在寻找的内容。
- 字符串必须是 24 个字母数字字符。
- 至少有 8 个字符必须是字母。
- 字符串的最后 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}
) 必须位于字符串的末尾 ($
)。