我需要一个正则表达式来满足基本密码策略的标准。
第一个字符是大写字母,以 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
对每个标准进行一次测试,这将使其更容易维护和扩展。
- 第一个字符是大写字母:
^[[:upper:]]
- 最后两个字符是数字:
[[:digit:]][[:digit:]]$
- 长度为 8 个字符:
^.{8}$
- 其他字符均为小写(未明确说明):
^.[[: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
如果你将所有内容都塞进一个正则表达式中,你就无法做到这一点......