任何人都可以向我解释这个密码复杂性正则表达式吗?

时间:2011-01-06 06:30:01

标签: regex

\A(?=\S*?[A-Z])(?=\S*?[a-z])(?=\S*?[0-9])\S{6,}\z

(这来自正则表达式的JGSoft风格)。

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

因此,有三个组可以按任何顺序放置(第一个大写字母,然后是非大写字母,然后是数字)。 \ A匹配字符串的开头,\ z匹配字符串的结尾。我有点困惑(?=部分。它应该是一个积极的前瞻。我不知道这个正则表达式如何允许你以任何顺序键入密码字符。

2 个答案:

答案 0 :(得分:4)

看起来你得到了基本的想法。想想这样:

  1. 从文本开头看。在开始时:
    1. 检查至少有一个大写字母(只是看,不要前进)。
    2. 检查至少有一个小写字母。
    3. 检查至少有一位数。
  2. 至少匹配6个非白色字符。
  3. 前瞻不是捕获 - 你停留在同一个位置(在这种情况下是开始),并检查你是否匹配此前进 - 这就是订单无关紧要的原因

    以下是输入1@34Ab的示例。

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

答案 1 :(得分:1)

Lookahead意味着我测试是否有模式而不改变位置,所以

  1. 它从头开始测试 字符串有零个或多个没有 白色空间后跟大写 后者。

  2. 然后再次检查 如果有的话,字符串的开头 零个或多个没有空格 其次是小写后者。

  3. 然后再次检查 如果有的话,字符串的开头 零个或多个没有空格 然后是数字。

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

  5. 前3个测试(大写,小写,数字)预测 - 检查是从字符串的开头而不改变位置,只有最后一个测试(6个或更多字符)改变位置。 lookahead是它的名字,只是看看,看看没有移动的东西,所以从字符串的开头执行前3个测试,所以只要所有3个都是正面的顺序并不重要

相关问题