【问题标题】:Can anyone please explain this password complexity regexp to me?谁能向我解释这个密码复杂性正则表达式?
【发布时间】:2011-01-06 06:30:01
【问题描述】:
\A(?=\S*?[A-Z])(?=\S*?[a-z])(?=\S*?[0-9])\S{6,}\z

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

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

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

【问题讨论】:

    标签: regex


    【解决方案1】:

    看起来你明白了基本的想法。这样想:

    1. 从文本的开头看。在开始时:
      1. 检查是否有至少一个大写字母(仅通过查看,不要前进)。
      2. 检查至少有一个小写字母。
      3. 检查至少有一位数字。
    2. 将至少 6 个非空白字符匹配到末尾。

    前瞻没有捕捉到 - 你停留在同一个位置(在这种情况下是开始),并检查你是否可以匹配这个 - 这就是顺序无关紧要的原因

    以下是输入 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)。

    【讨论】:

      【解决方案2】:

      Lookahead 表示我在不改变可能位置的情况下测试是否存在模式

      1. 它测试是否从开头 字符串有零个或多个无 空格后跟大写 后者。

      2. 然后它再次从 字符串的开头(如果有) 零个或多个无空格 后跟小写字母。

      3. 然后它再次从 字符串的开头(如果有) 零个或多个无空格 后跟数字。

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

      前 3 个测试(大写、小写、数字)前瞻 - 检查是从字符串的开头而不更改位置,只有最后一个测试(6 个或更多字符)会更改位置。 前瞻是它的名字,说只是看看,看看会发生什么,所以前 3 个测试是从字符串的开头执行的,所以只要所有 3 个都是肯定的,顺序并不重要

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-13
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        • 2017-04-16
        相关资源
        最近更新 更多