PHP Regex模式混乱

时间:2014-07-07 13:11:26

标签: php regex

我无法制作一些正则表达式模式,因此我搜索了大部分模式,并在此过程中遇到了问题。我主要理解构建正则表达式模式时的游戏规则,但不了解如何创建正则表达式,以检查字符串中是否至少有1种特定类型的字符。这是我在网上找到的:

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

我无法理解的是:

  • 这对?=.*来说是什么意思,它意味着什么在一起或只是单独的属性
  • 为什么大括号和普通大括号之间有. ).{据我知道它的任何字符,除非它意味着前面提到的任何一个但是是什么使它以这种方式工作
  • 最后一个问题是正则表达式的工作方式是它实际检查是否提供了所需的字符,但是当我看到这个时我也不能输入ąó"(^!这样的内容看到任何提到角色的地方

正如你已经想到的那样,我试图构建密码验证正则表达式并努力解决这个问题。

修改

如果有可能有人对此正则表达式进行更改,那么这并不意味着

  • 需要一个数字,小写,大写,提供列表的特殊字符,以及填写空白的其他内容

因此它意味着

  • 需要一个数字,小写,大写,提供列表的特殊字符和填充空白与所提到的规则的字符,所以你可以继续从提供的列表中键入数字字母和特殊字符,但不能像{{1 }}

2 个答案:

答案 0 :(得分:1)

(?=...)positive lookahead assertion。它断言所包含的正则表达式可以匹配当前位置而不实际执行匹配。例如,(?=.*\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

顺便说一句,捕获组完全没必要。

答案 1 :(得分:0)

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

^在字符串

的开头断言位置      

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

     

(?=.*\d) 肯定前瞻 - 断言下面的正则表达式可以匹配

     

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

     

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

     

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

     

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

     

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

     

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

     

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

     

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

     

$断言字符串末尾的位置


  

参考:

     

regex101


修改.更改为[^__blacklisted_characters_here__]