正则表达式满足密码要求

正则表达式满足密码要求

我需要一个正则表达式来满足基本密码策略的标准。

第一个字符是大写字母,以 2 位数字结尾,长度为 8 个字符

这是我到目前为止所拥有的。

^(?=.*[A-Z])^(?=.*[a-z])(?=.*\d)(?=.*\d).{8,}$

它符合我想要的标准,例如Passwo12但也匹配

Passw123 (unacceptable)
Pa234567 (unacceptable)

我希望它被具体限制为[大写] [小写 [az] x5] [数字 x2]

答案1

我建议类似:

grep -E '^[[:upper:]][[:lower:]]{5}[[:digit:]]{2}$' input

或者使用 Bash 的[[ .. ]]条件:

[[ $pass =~ ^[[:upper:]][[:lower:]]{5}[[:digit:]]{2}$ ]] && echo OK

答案2

对每个标准进行一次测试,这将使其更容易维护和扩展。

  1. 第一个字符是大写字母: ^[[:upper:]]
  2. 最后两个字符是数字: [[:digit:]][[:digit:]]$
  3. 长度为 8 个字符:^.{8}$
  4. 其他字符均为小写(未明确说明):^.[[:lower:]]*..$

使用sed(仅允许通过符合上述条件的密码):

sed -r \
    -e '/^[[:upper:]]/!d' \
    -e '/[[:digit:]][[:digit:]]$/!d' \
    -e '/^.{8}$/!d' \
    -e '/^.[[:lower:]]*..$/!d'

通过这种方式,您可以轻松地添加其他标准或独立于其他标准(或多或少)修改现有标准。

-r是为了允许标准 #3 中的扩展正则表达式。


sed将评论密码不符合标准的方式:

sed -r \
    -e '/^[[:upper:]]/!a\
No initial upper-case
' \
    -e '/[[:digit:]][[:digit:]]$/!a\
No trailing digits
' \
    -e '/^.{8}$/!a\
Not 8 characters
' \
    -e '/^.[[:lower:]]*..$/!a\
Not only lower-case middle chars

如果你将所有内容都塞进一个正则表达式中,你就无法做到这一点......

相关内容