c# 验证密码 正则表达式 不允许有连续数字 如12 ,23,34,45,678 等,但是可以间隔其他字符连续 如1a2,2u3,1a2u3, 同时还要 密码至少要包含一个数字、一个小写字母、一个大写字母、一个特殊字符,并且位数必须为8~20位
2条回答 默认 最新
檀越@新空间 2025-12-08 10:55关注上午好☀️☀️☀️️
本答案参考通义千问在 C# 中,使用正则表达式来验证密码时,需要满足以下几个条件:
- 密码长度为 8~20 位
- 必须包含至少一个数字
- 必须包含至少一个小写字母
- 必须包含至少一个大写字母
- 必须包含至少一个特殊字符(如 !@#$%^&*()_+)
- 不允许有连续的数字,例如:
12,23,678等 - 允许间隔其他字符的连续数字,例如:
1a2,2u3,1a2u3等
✅ 解决方案:
一、正则表达式规则分析
我们需要构建一个正则表达式,满足上述所有条件。
1. 长度限制
^.{8,20}$2. 至少一个数字
(?=.*\d)3. 至少一个小写字母
(?=.*[a-z])4. 至少一个大写字母
(?=.*[A-Z])5. 至少一个特殊字符
(?=.*[!@#$%^&*()_+])6. 不允许有连续的数字(如
12,23,678)- 这是一个难点,因为正则表达式无法直接检测“连续数字”(比如
12是连续的,但1a2不是)。我们可以使用 否定型预查 来匹配任何两个或更多连续数字的情况。
(?!.*\d{2})注意:这个表达式会阻止所有两个或以上的连续数字。例如:
12、23、678等都会被拒绝,但像1a2、1a2u3等会被接受。
✅ 最终的正则表达式:
^[a-zA-Z0-9!@#$%^&*()_+]{8,20}$ (?=.*\d) (?=.*[a-z]) (?=.*[A-Z]) (?=.*[!@#$%^&*()_+]) (?!.*\d{2})$⚠️ 注意:上面的正则表达式格式并不完全正确,因为在 C# 中,正则表达式字符串需要写成一个完整的模式。我们将其整合为一个完整的正则表达式字符串。
✅ 正确的 C# 正则表达式字符串:
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+])[^\d]{8,20}$|^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+]).*(?!\d{2}).*$⚠️ 上面的正则表达式仍然存在逻辑问题,不能准确地防止连续数字。为了更精确地实现“不允许连续数字”,我们可以使用 负向前瞻 和 非贪婪匹配 来实现。
✅ 优化后的正则表达式(推荐):
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+])((?:[^0-9]|\b)(?:\d{1}(?:[^0-9]|\b))*){8,20}$说明:
(?:[^0-9]|\b)表示不是数字或者单词边界(用于防止连续数字)\d{1}表示一个数字((?:...){8,20})表示整个密码长度为 8~20 位
✅ C# 示例代码:
using System; using System.Text.RegularExpressions; class Program { static void Main() { string pattern = @"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+])((?:[^0-9]|\b)(?:\d{1}(?:[^0-9]|\b))*){8,20}$"; Regex regex = new Regex(pattern); string[] testPasswords = { "A1a!1234", // ❌ 不允许连续数字(12) "A1a!2345", // ❌ 不允许连续数字(23) "A1a!2b3", // ✅ 合法 "A1a!2b3c4D5!", // ✅ 合法 "12345678", // ❌ 没有字母和特殊字符 "AbcdefgH!", // ❌ 没有数字 "A1b2c3d4eF!", // ✅ 合法 "A1a2b3c4D!", // ❌ 连续数字(12, 23, 34) "A1a!2b3c4D!" // ✅ 合法 }; foreach (var pwd in testPasswords) { Console.WriteLine($"{pwd}: {regex.IsMatch(pwd)}"); } } }
✅ 总结:
- 密码长度必须是 8~20 位
- 必须包含至少一个数字、小写字母、大写字母、特殊字符
- 不允许出现连续的数字(如
12,23,678) - 允许数字之间夹杂其他字符(如
1a2,2u3,1a2u3)
✅ 关键点加粗展示:
- 不允许连续数字:使用 负向前瞻 或 分组匹配 来避免这种情况。
- 密码长度限制:使用
{8,20}控制长度范围。 - 必须包含的字符类型:使用 正向先行断言 (
(?=...)) 来确保每种字符都存在。 - 特殊字符:定义一组常用特殊字符,如
!@#$%^&*()_+。
如有需要,我也可以提供一个更复杂的版本,支持自定义特殊字符集。欢迎继续提问!
解决 无用评论 打赏 举报