Regex 形成正则表达式的特殊方式?

Regex 形成正则表达式的特殊方式?,regex,Regex,我遇到过这个正则表达式,我想知道它是如何使用的: ^.*(?=.{10,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$ 我想知道正则表达式的各个部分是什么意思,而不仅仅是正则表达式的整体功能 根据我对正则表达式的了解,我认为它匹配任何匹配数字(0-9)、小写和大写字母的输入(至少10个字符长),但我需要确认这是否正确 编辑 我也不知道它的目的是什么,但看看我认为它的作用,正则表达式是否可以简化为: [\d|[a-zA-Z]]{10,} 编辑2 我注意到我的替换正则表达

我遇到过这个正则表达式,我想知道它是如何使用的:

^.*(?=.{10,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$
我想知道正则表达式的各个部分是什么意思,而不仅仅是正则表达式的整体功能

根据我对正则表达式的了解,我认为它匹配任何匹配数字(0-9)、小写和大写字母的输入(至少10个字符长),但我需要确认这是否正确

编辑

我也不知道它的目的是什么,但看看我认为它的作用,正则表达式是否可以简化为:

[\d|[a-zA-Z]]{10,}
编辑2
我注意到我的替换正则表达式不能确保我至少有一个要求(至少有一个数字、大写字母和小写字母)。有没有办法调整它,使正则表达式也可以这样做,或者只有原始正则表达式才能这样做?

我可以解释正则表达式的各个部分都做了什么,但总的来说,我觉得这很奇怪:

^.*(?=.{10,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$
基本上你所说的是真的-在正则表达式中没有其他的魔力

^.*
-匹配行首和0+个字符,然后确保

以下只是断言-它们都不匹配/捕获任何内容。如果你想查的话,这叫做积极前瞻。如果所有结果均为true,则正则表达式的最后一部分将执行其余操作:

(?=.{10,})
-从第一个匹配停止处(可能在行首之后)有一个10+个字符的字符串(任意字符)

(?=.*\d)
-前面的整个字符串中至少有一个数字

(?=.*[a-z])
-和小写字母

(?=.*[A-Z])
-和大写字母

如果所有这些都是真的,那么:

*$
-匹配所有内容,直到行尾

注意:如果任何断言失败,将不会匹配任何内容

到您的编辑


我不这么认为——说字符串中有一个大写字母和一个小写字母以及一个数字,说字符串由10+个字符组成,其中所有字符都是数字或字母(大写或小写),或者两者都是,这是不一样的。您的正则表达式将匹配一个仅由数字和字母组成的字符串,或者两者的混合-原始正则表达式确保这些类中的每个类至少表示一次。似乎有人用它来验证用户密码或类似的东西。

这可能是用来验证候选密码-它

  • 检查其长度是否至少为10个字符
  • 检查它是否包含至少一个数字
  • 检查它是否包含至少一个小写字母
  • 检查它是否包含至少一个大写字母
  • 您的替换正则表达式并不完全相同,因为它只满足上述条件——长时间的讨厌正则表达式将满足这些条件。也没有对上述条件的指令;字母或数字可以出现在字符串中的任何位置


    实际上,我看不到进一步简化它的方法-您可能会删除开头的。*和结尾的。*$,因为它们实际上没有任何用途。但除此之外,长正则表达式在联合施加这些条件而不施加命令方面做得很好。

    我认为这是用来确保密码强度的:它必须至少有10个字符长,至少有1个数字,至少有1个小写字母,至少有1个大写字母

    整个正则表达式最重要的部分是
    (?=…)
    操作符,它匹配,但不使用它匹配的字符串部分。因此,多个相邻的
    (?=…)
    充当AND运算符

    (?=.{10,})
    匹配至少10个字符的任何序列

    (?=.*\d)
    匹配任何内容后面的单个数字

    (?=.[a-z])
    匹配任何内容后面的小写字符

    (?=.[A-Z])
    匹配任何内容后面的大写字符

    因此,这个正则表达式将匹配任何具有至少10个字符长的子字符串、至少具有一个数字、一个小写字符和一个大写字符的字符串

    您可以看到,它听起来比它应该的更复杂,尤其是子字符串部分。实际上,紧跟在
    ^
    之后的
    *
    部分是不必要的,我们可以将其简化为

    ^(?=.{10,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$
    

    正如其他人所说,这是一个密码强度验证正则表达式,但开头的
    *
    不应该存在。实际上,
    *
    最初消耗整个字符串,然后回溯,直到它到达一个所有四个lookahead都可以匹配的位置。它是有效的,但是如果不需要的话,为什么要让正则表达式做这么多的工作呢

    ^(?=.{10,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$
    
    删除前导的
    *
    后,正则表达式永远不必回溯(除非在成功的前向回溯后返回起始位置)。至于最后的
    *$
    ,它可能没有必要,但也没有坏处。我会保留它,以防有人试图使用匹配结果而不是原始字符串

    还有一点:您可以通过删除第一个前瞻并将
    {10,}
    替换为
    *
    ,使正则表达式更加简洁:

    ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{10,}$
    
    之所以这样写,是为了解决Internet Explorer()中长期存在的一个bug。这个bug最终在IE8或IE9中得到了修复,但我会保持原样,以防万一