如何理解特定的正则表达式模式?

时间:2018-08-23 17:40:25

标签: regex

我在网上找到了此正则表达式,但是我很难理解它。就是这样:

(?=^.{6,10}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+}{":;'?/>.<,])(?!.*\s).*$

http://regexlib.com/Search.aspx?k=password&c=-1&m=5&ps=100

说明是:

  

此正则表达式匹配可用于验证强密码。期望至少1个小写字母,1个大写字母,1个数字,1个特殊字符,并且长度应在6到10个字符之间。字符的顺序并不重要。此表达式遵循Microsoft为强密码指定的上述4个规范。

我看到有以下几组。我读过?=意味着要向前看。

  • (?=^.{6,10}$)是否意味着可以预见应该有6到10个字符?
  • (?=.*\d)是否意味着可以预见应该有0个或多个字符,然后跟一个数字(至少一个数字)?是否可以将其写为(?=\d+)表示至少应该有1位数字?
  • (?=.*[a-z])模式以匹配a-z。同样,这可以写成(?=[a-z]+)吗?
  • (?=.*[A-Z])模式以匹配A-Z。同样,这可以写成(?=[A-Z]+)吗?
  • (?=.*[!@#$%^&*()_+}{":;'?/>.<,])也不需要.*吗?
  • (?!.*\s).*$-这是什么意思?

1 个答案:

答案 0 :(得分:0)

您对第一组是正确的。因为它以^$开头和结尾锚定,所以它必须匹配整个输入。因此,必须有6-10个字符。

接下来的四个前行需要在开头.*,以便在输入中的任何位置匹配所需的字符类型。如果您只写了(?=\d+),则必须匹配输入中当前位置的数字,这是开始。通过为每个前缀加上.*,它允许不同的类型(数字,小写,大写,标点符号)以任意顺序排列。您无需在其后放置+,因为匹配一个匹配项就足够了。

(?!.*\s)阴性前瞻。 \s与空格匹配,因此这意味着字符串必须包含任何空格。

最后,.*$仅匹配整个输入。在所有前瞻之后才需要一些东西。