PHP Regex模式混淆


PHP Regex pattern confusion

我不能使一些正则表达式模式工作,所以我谷歌了他们中的大多数,并在这个过程中遇到了问题。在构建正则表达式模式时,我大多理解规则,但不理解如何创建检查字符串中是否至少有一种特定类型的字符的正则表达式。这是我在网上找到的:

'/^((?=.*'d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})$/'

我不明白的是:

  • 对于?=.*来说这是什么意思它是指一些东西在一起还是单独的属性
  • 为什么在花括号和正常的).{之间有.,据我所知它的任何字符,除非它意味着前面提到的任何字符,但是是什么使它以这种方式工作
  • 最后一个问题是regex的工作方式,它实际上检查是否提供了所需的字符,但也允许输入ąó"(^!之类的东西,当我看到这个时,我没有看到任何地方提到的字符是允许的

正如你已经弄清楚了,我试图建立密码验证正则表达式,并与此斗争。

编辑

如果可能的话,有没有人可以修改一下这个正则表达式,这样它就不会意味着

  • 要求数字、小写、大写、所提供列表的特殊字符之一,而不是其他任何内容来填充空白

所以它的意思是

  • 要求输入数字、小写、大写、特殊字符中的一种,并使用上述规则中的字符填充空白,因此您可以继续输入数字、字母和特殊字符,但不能输入!óż
  • 等特殊字符。

(?=...)是一个正向的前瞻性断言。它断言所包含的正则表达式可以在当前位置匹配,而无需实际执行匹配。例如,(?=.*'d)表示"检查是否有可能匹配任意数量的字符,后面跟着一个数字",这意味着"检查字符串前面是否至少有一个数字"。

分解正则表达式,这意味着:

^             # Start of string
(             # Match and capture in group 1:
 (?=.*'d)     # Assert that there is at least one digit in the string
 (?=.*[a-z])  # Assert that there is at least one lowercase letter in the string
 (?=.*[A-Z])  # Assert that there is at least one uppercase letter in the string
 (?=.*[@#$%]) # Assert that there is at least one of the characters @#$%
 .{6,20}      # Match 6-20 characters (any character except newlines)
)             # End of group
$             # End of string

顺便说一下,捕获组是完全没有必要的。

/^((?=.*'d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})$/

^断言位置在字符串的开始

第一个捕获组((?=.*'d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})

(?=.*'d) 正向前看-断言下面的正则表达式可以匹配

任意数量的任意字符,后面跟着一个数字。也就是说,string必须包含一个数字。

(?=.*[a-z]) 正向前看-断言下面的正则表达式可以匹配

任意数量的任意字符,后面跟着一个字符,范围在a到z之间(区分大小写)。也就是说,字符串必须包含一个小写字符。

(?=.*[A-Z]) 正向前看-断言下面的正则表达式可以匹配

任意数量的任意字符,后面跟着a到Z之间的单个字符(区分大小写)。也就是说,字符串必须包含一个大写字符。

(?=.*[@#$%]) 正向前看-断言下面的正则表达式可以匹配

任意数量的任意字符,后面跟着列表中的单个字符@#$%。也就是说,字符串必须包含@#$%。

.{6,20}匹配6到20次的任何字符(换行符除外)。

$断言字符串末尾的位置


:引用的

regex101


编辑:

修改.[^__blacklisted_characters_here__]