繁体   English   中英

PHP Regex模式混乱

[英]PHP Regex pattern confusion

我无法使几个正则表达式模式起作用,所以我在其中搜索了大多数正则表达式模式,并在此过程中遇到了问题。 我在构建正则表达式模式时最了解游戏规则,但不了解如何创建用于检查字符串中是否至少包含某种特定字符的正则表达式。 我在网上发现的:

'/^((?=.*\\d)(?=.*[az])(?=.*[AZ])(?=.*[@#$%]).{6,20})$/'

我不明白的是:

  • ?=.*含义是什么,意味着在一起或只是单独的属性
  • 为什么在那儿. 在花括号和普通花括号之间).{据我所知,它的任何特性,除非它表示先前提到的任何含义,但是什么使其能够以这种方式工作
  • 最后一个问题是,正则表达式的工作方式实际上是检查是否提供了所需的字符,但也允许键入类似ąó"(^! ąó ,当我看到此ąó时,我看不到任何提到的字符都允许

正如您已经知道的那样,我试图构建密码验证正则表达式并为此而苦苦挣扎。

编辑

如果可能的话,有人可以对此正则表达式进行修改,所以这并不意味着

  • 需要数字,小写字母,大写字母,提供的列表的特殊字符之一,并且比其他任何字符都要填空

所以它的意思是

  • 要求提供的列表中的数字,小写,大写,特殊字符之一,并用提及的规则字符填充空格,因此您可以继续输入提供的列表中的数字字母和特殊字符,但不能输入某些特殊字符,如!óż

(?=...)是一个积极的超前断言 它断言,封闭的正则表达式可以在当前位置匹配,而无需实际执行匹配。 因此,例如, (?=.*\\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)(?=.*[az])(?=.*[AZ])(?=.*[@#$%]).{6,20})

(?=.*\\d) 正向超前-断言可以匹配以下正则表达式

任意数量的字符,后跟一个数字。 换句话说,字符串必须包含一个数字。

(?=.*[az]) 正向超前-声明可以匹配以下正则表达式

任意数量的任何字符,后跟单个字符,介于a和z之间(区分大小写)。 换句话说,字符串必须包含小写字符。

(?=.*[AZ]) 正向超前-断言可以匹配以下正则表达式

任意数量的任何字符,后跟单个字符,介于A和Z之间(区分大小写)。 换句话说,字符串必须包含一个大写字符。

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

任意数量的任何字符,然后按字面意义在列表@#$%中紧跟一个字符。 换句话说,字符串必须包含@#$%。

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

$在字符串末尾的断言位置


引用人:

regex101


编辑:更改. [^__blacklisted_characters_here__]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM