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个字符长,至少有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中得到了修复,但我会保持原样,以防万一