regex - 正则表达式 2 数字或特殊字符
问题描述
所以我正在尝试创建一个执行以下操作的正则表达式:
最少 12 个字符,需要大写字母,需要小写字母,需要 2 个数值或 2 个特殊字符。
目前我有以下内容:
~^(?=\P{Ll}*\p{Ll})(?=\P{Lu}*\p{Lu})(?=.*[!@#$%^&*()]|\D*\d).{12,}~u
哪个是 1 个数字或 1 个特殊字符,而不是 2。我尝试将 {2} 添加到 OR 条件,但是,这需要两个不正确的组合。
任何帮助,将不胜感激。
解决方案
您应该将(?=.*[!@#$%^&*()]|\D*\d)
前瞻替换为(?:(?=(?:[^!@#$%^&*()]*[!@#$%^&*()]){2})|(?=(?:\D*\d){2}))
. 正则表达式看起来像
'~^(?=\P{Ll}*\p{Ll})(?=\P{Lu}*\p{Lu})(?:(?=(?:[^!@#$%^&*()]*[!@#$%^&*()]){2})|(?=(?:\D*\d){2})).{12,}$~u'
请参阅正则表达式演示。
前瞻匹配紧随其后的位置
(?:[^!@#$%^&*()]*[!@#$%^&*()]){2}
- 除了字符之外的任何 0+ 字符的两次重复,!@#$%^&*()
后跟!@#$%^&*()
列表中的字符|
- 或者(?=(?:\D*\d){2}
- 任何 0+ 个非数字字符重复两次,后跟一个数字