【问题标题】:Regex validation in ASP.Net MVCASP.Net MVC 中的正则表达式验证
【发布时间】:2016-03-05 21:30:36
【问题描述】:

在我的演示 MVC 应用程序中,我有以下验证规则来验证我的域模型类。

        RuleFor(m => m.Password)
            .Matches(@"^(?=(\d){2,})(?=([a-z])+)(?=(\.\$\~\&)*)").WithMessage("Password should contain at least 2 digits");

但是密码验证失败。 基本上我想验证密码输入值应该至少包含 2 位数字,至少一个特殊字符 (.$~&) 和至少一个任意顺序的字母表。

它们可以按任何顺序出现。

基本上我应该匹配像

这样的字符串
'a2ss1~A33',
'678.&aA88'

但不是

'aaa2sfhdjkf^',
 'aass'.

我也刚刚在正则表达式中遇到了前瞻。 我仍然有疑问,为什么我们不能有验证密码字段的规则?

.Matches(@"^((\d){2,})(.*[a-zA-Z])([\.\$\~\&]*)").WithMessage("Password should contain at least 2 digits");

什么时候在正则表达式中使用前瞻,什么时候不使用?

【问题讨论】:

  • 请贴出密码无效的密码,应该匹配的密码,不应该匹配的密码,只是将问题归结为实际问题。不需要展示什么效果很好。

标签: c# asp.net regex asp.net-mvc validation


【解决方案1】:

你可以使用

^(?=(\D*\d){2})(?=[^A-Za-z]*[A-Za-z])(?=[^.$~&]*[.$~&]).*

请参阅regex demo

正则表达式匹配:

  • ^ - 字符串开头
  • (?=(\D*\d){2}) - 字符串中的任意位置都需要 2 位数字
  • (?=[^A-Za-z]*[A-Za-z]) - 字符串中某处需要一个 ASCII 字母
  • (?=[^.$~&]*[.$~&]) - [.$~&] 集合中的符号是必需的
  • .* - (可选,如果不需要完整的字符串匹配则删除)匹配除换行符之外的所有字符,直到行尾

Lookaheads 允许从字符串中的同一位置进行多次检查(这里,在最开始,因为它们都放在^ 之后)。正则表达式 ^((\d){2,})(.*[a-zA-Z])([\.\$\~\&]*) 需要 2 个或更多数字开头,后跟除换行符以外的任何 0+ 字符,后跟 1 个字母,后跟 0+ 一些特殊符号。之后可能还有其他内容,因为您没有检查字符串的结尾。

【讨论】: