2011-01-06 61 views
2
\A(?=\S*?[A-Z])(?=\S*?[a-z])(?=\S*?[0-9])\S{6,}\z 

(这来自JGSoft正则表达式的味道)。任何人都可以请解释这个密码复杂性正则表达式给我?

基本上,这个正则表达式的目的是这样的:“密码复杂 测试是否输入由6个或更多字符 输入必须包含至少一个大写字母,一个小写字母和一个数字。”。

因此,可以按任意顺序放置三个组(第一个大写字母,然后是非首字母,然后是数字)。 \ A匹配字符串的开头,\ z匹配字符串的结尾。我对(?=部分)感到困惑,它应该是一个积极的向前看,我不明白这个正则表达式是如何让你按任意顺序输入密码字符的,

回答

4

看起来像你得到。基本思路想想看这样的:从文本开始

  1. 外观,同时在启动:
    1. 检查有至少一个大写字母(只是看,不提前)
    2. 检查是否有至少一个小写字母
    3. 检查至少有一位数字。
  2. 匹配至少6个非whitesapce字符到最后。

查找aheads不捕获 - 你留在同一个位置(开始,在这种情况下),并检查是否你这个比赛向前 - 这就是为什么顺序并不重要

下面是一个示例,输入为[email protected]

  1. \A - 匹配字符串的开头。大。
  2. (?=\S*?[A-Z]) - \S*?[A-Z]可匹配[email protected](?=)断言成功。
  3. (?=\S*?[a-z]) - 可匹配[email protected]
  4. (?=\S*?[0-9]) - 可以匹配1
  5. \S{6,} - 匹配1 @ 34Ab,一直到最后(\z)。
1

先行意味着我测试是否有不改变5的位置,以便

  1. 它测试,如果从 字符串的开头有零个或多个无 空白,接着上的图案后者为 。

  2. 然后它从 开始字符串的再次检查是否存在 零个或多个无空白 随后小写后者。

  3. 那么它从一开始 字符串的再次检查,如果有 零个或多个无空格 其次是数字。

  4. 最后检查字符串是否为6 或更多没有空格字符。

第一3个试验(大写,小写,数字)先行 - 检查是从字符串的开头,而不改变位置只有最后试验(6个或更多字符)改变位置。 lookahead是它的名字说的只是看看看到什么而没有移动,所以前三个测试是从字符串的开始执行的,所以顺序并不重要,只要所有3都是正数就可以了。

相关问题