提问者:小点点

我的常规Expression在C#中不起作用


我需要一个正则表达式,检查密码是否包含至少一个小写字母,至少一个大写字母,至少两个数字和至少一个(_*&$)。这是一个MVC项目。这就是我所拥有的

[RegularExpression(@"(?=\.\*\\d{2})(?=\./*[a-z])(?=\.\*[A-Z])(?=.*[_*&$])", ErrorMessage = "The password must contain at least 1 letter, 2 digits and a special symbol (_*&$)")]

共1个答案

匿名用户

当前的正则表达式有很多问题:

  • 您转义了.*,现在它们表示文本.*字符,而您希望将它们用作特殊的正则表达式元字符
  • 若要匹配至少两个数字,不能只使用\d{2}模式,因为它不匹配非连续数字,您需要\d.*\d或更有效的(?:\d*\d){2}
  • 您仅使用lookahead,非消耗模式,但RegularExpressionAttribute需要一个完整的字符串来匹配该模式。

因此,你需要

@"^(?=(?:\D*\d){2})(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=[^_*&$]*[_*&$]).*"

详细信息

  • ^-字符串开始
  • (?=(?:\d*\d){2})-两个不一定连续的数字
  • (?=[^a-z]*[a-z])-至少一个小写ASCII字母
  • (?=[^A-Z]*[A-Z])-至少一个大写ASCII字母
  • (?=[^_*&$]*[_*&$])-_*&$集中的至少一个特殊字符
  • .*-整个字符串(没有换行符)(它会被消耗)。