首页 > 解决方案 > 我的常规表达式在 C# 中不起作用

问题描述

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

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

标签: c#regexasp.net-mvc

解决方案


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

  • 您转义了.and *,现在它们表示文字.*字符,而您想将它们用作特殊的正则表达式元字符
  • 要匹配至少两个数字,您不能只使用\d{2}模式,因为它不匹配非连续数字,您需要\d.*\d或更有效的(?:\D*\d){2}
  • 您只使用前瞻、非消耗模式,但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 字母
  • (?=[^_*&$]*[_*&$])_*&$-集合中至少一个特殊字符
  • .*- 整个字符串(没有换行符)(它被消耗)。

推荐阅读