正则表达式 - 如何忽略匹配组的顺序?

时间:2014-06-15 18:01:59

标签: javascript regex html5

我正在尝试为密码创建一个正则表达式验证:

  1. 长度超过6个字符
  2. 至少有一个a-z
  3. 至少有一个A-Z
  4. 有一个0-9
  5. 所以,换句话说,比赛将有:

    1. 至少一个a-z,A-Z,0-9
    2. 至少3个任何其他角色
    3. 我想出了:

      ((.*){3,}[a-z]{1,}[A-Z]{1,}[0-9]{1,})
      

      对我来说这似乎很简单和合乎逻辑,但有两件事情出错:

      1. {3,}的量词(.*)以某种方式不起作用并破坏整个正则表达式。起初我最后有{6,}但是正则表达式会影响内部组中的量词,所以它需要[A-Z]{6,}而不是[A-Z]{1,}
      2. 当我删除{3,}正则表达式时,但只有在这些组有序时才会匹配 - 这样才会匹配aaBB11,而不是BBaa11

3 个答案:

答案 0 :(得分:4)

这是一个用例,我不会使用单个正则表达式,而是使用多个简单表达式。

仍然,要回答您的问题:如果您只想验证密码是否符合这些条件,您可以使用前瞻:

^(?=.{6})(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9])

你基本上是在找一个你看的位置

  • 6个字符(可能更多,无关紧要):(?=.{6})
  • 也许是一些小写字母:(?=.*?[a-z])
  • 也许是一些东西,然后是大写字母:(?=.*?[A-Z])
  • 也许是某种东西,然后是数字:(?=.*?[0-9])

出现的顺序是任意的,因为可能是部分。

(请注意,我已将 6个字符长解释为至少6个字符。)

答案 1 :(得分:1)

您可以使用此模式^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{6,}

答案 2 :(得分:1)

我相信这就是你想要的:

^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[!-~]{6,}$

如果我们按照您的规范,您的验证密码如下:

^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{6,}$

但是,我们需要对此进行改进,因为除了数字,小写和大写字母外,你真的愿意接受任何角色吗?例如,用户可以使用泰语中的字符吗?空间角色?标签?没想到。 :)

如果您想允许除空格之外的所有可打印ASCII characters而不是点,我们可以使用此字符范围:[!-~]

它是如何运作的?

  • ^锚点确保我们在字符串
  • 的开头开始匹配
  • (?=.*[a-z])前瞻确保我们有一个小写字符
  • (?=.*[A-Z])前瞻确保我们有一个大写字符
  • (?=.*[0-9])前瞻确保我们有数字
  • (?=.*[a-z])前瞻确保我们有一个小写字符
  • [!-~]{6,}匹配六个或更多非空格的ASCII可打印ASCII字符。
  • $确保我们已到达字符串的末尾(否则,密码可能包含更多不允许的字符)。