我想使用正则表达式来验证密码的字符要求。
要求: 密码应包含16个字符。
我尝试使用正向表达式使用正则表达式,但最终无法使用:
echo 'XXXX9999ccccXXX%' | grep -P '^((?=.*[0-9]).{4})((?=.*[a-z]).{4})((?=.*[A-Z]).{4})((?=.*\pP).{4})$'
答案 0 :(得分:4)
您的超前语法已关闭,因为它没有正确检查您的需求中提到的位置。以下正则表达式模式似乎对我有用:
^(?=.{0,3}\d)(?=.{4,7}[a-z])(?=.{8,11}[A-Z])(?=.{12,15}[.,$%^&!@]).{16}$
说明:
(?=.{0,3}\d) - number in positions 1-4
(?=.{4,7}[a-z]) - lowercase in positions 5-8
(?=.{8,11}[A-Z]) - uppercase in positions 9-12
(?=.{12,15}[.,$%^&!@]) - symbol in positions 13-16
我对grep
或Linux没有足够的了解,无法评论您是否在最佳使用状态,但这至少可以解决您在使用该模式时遇到的任何问题。
答案 1 :(得分:1)
您可以使用
^(?=.{0,3}\d).{4}(?=.{0,3}[a-z]).{4}(?=.{0,3}[A-Z]).{4}(?=.{0,3}[\W_]).{4}$
请参见this demo
基本上,该模式包括四个先行消费模式部分,并且由于每个消费模式总共匹配4个字符,因此它匹配16个字符的字符串(请注意,^
和$
锚也是重要)。
详细信息
^
-字符串的开头(?=.{0,3}\d)
-0到3个字符后必须有一个数字.{4}
-消耗了4个字符(?=.{0,3}[a-z])
-0到3个字符后必须有一个小写字母.{4}
-消耗了4个字符(?=.{0,3}[A-Z])
-0到3个字符之间必须有一个大写字母.{4}
-消耗了4个字符(?=.{0,3}[\W_]).{4}
-0到3个字符后必须有一个特殊的字符(非字母数字)$
-字符串结尾