正则表达式密码验证

3

我想使用正则表达式来验证密码的字符要求。

要求: 密码应包含16个字符。

  1. 第1-4个字符应至少有1个数字。
  2. 第5-8个字符应至少有1个小写字母。
  3. 第9-12个字符应至少有1个大写字母。
  4. 第13-16个字符应至少有1个符号(标点符号)。

我尝试使用正向预查的正则表达式,但最终未能成功:

echo 'XXXX9999ccccXXX%' | grep -P '^((?=.*[0-9]).{4})((?=.*[a-z]).{4})((?=.*[A-Z]).{4})((?=.*\pP).{4})$'

2个回答

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

你可以使用

^(?=.{0,3}\d).{4}(?=.{0,3}[a-z]).{4}(?=.{0,3}[A-Z]).{4}(?=.{0,3}[\W_]).{4}$

请查看这个演示

基本上,该模式包括四个前瞻消耗模式部分,由于每个消耗模式匹配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个字符后有一个特殊字符(非字母数字字符),并消耗任意4个字符
  • $ - 字符串的结尾

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接