首页 > 解决方案 > 正则表达式 2 数字或特殊字符

问题描述

所以我正在尝试创建一个执行以下操作的正则表达式:

最少 12 个字符,需要大写字母,需要小写字母,需要 2 个数值或 2 个特殊字符。

目前我有以下内容:

~^(?=\P{Ll}*\p{Ll})(?=\P{Lu}*\p{Lu})(?=.*[!@#$%^&*()]|\D*\d).{12,}~u

哪个是 1 个数字或 1 个特殊字符,而不是 2。我尝试将 {2} 添加到 OR 条件,但是,这需要两个不正确的组合。

任何帮助,将不胜感激。

标签: regex

解决方案


您应该将(?=.*[!@#$%^&*()]|\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+ 个非数字字符重复两次,后跟一个数字

推荐阅读