正则表达式密码验证

时间:2018-10-04 06:43:50

标签: regex pcre assertion

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

要求: 密码应包含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 个答案:

答案 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

Demo

我对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个字符后必须有一个特殊的字符(非字母数字)
  • $-字符串结尾