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

时间:2012-05-31 07:18:51

标签: regex

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

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

我想知道正则表达式的各个部分是什么意思,而不仅仅是整个正则表达式的含义。

根据我所知道的正则表达式,我认为它匹配任何与数字(0-9),小写和大写字母匹配的输入(至少10个字符长),但如果这是正确的我需要确认吗? / p>

修改

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

[\d|[a-zA-Z]]{10,}

编辑2 我注意到我的替换正则表达式并不能确保我至少有一个要求(至少有一个数字,大写和小写字母)。有没有办法调整它以便正则表达式也可以这样做,或者只有原始正则表达式才能实现?

4 个答案:

答案 0 :(得分:6)

我可以解释正则表达式的部分内容,但总的来说我发现这很奇怪:

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

基本上你说的是真的 - 正则表达式中没有其他魔法。

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

以下只是断言 - 它们都不匹配/捕获任何东西。如果你想查找它,它被称为积极前瞻。如果所有这些都评估为真,则正则表达式的最后部分将完成其余部分:

(?=.{10,}) - 从第一个匹配停止的地方(可能在行的开头之后)有一串10个字符(任何字符)

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

(?=.*[a-z]) - 还有一个小写字母

(?=.*[A-Z]) - 还有一个大写字母

如果一切正确,那么:

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

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

进行修改

我不这么认为 - 说字母表中有一个大小写字母和一个数字,并且说该字符串由10个以上字符组成,其中所有字符都是数字,这是不一样的或字母(大写或小写)或两者。你的正则表达式将匹配一个字符串,该字符串只包含数字,只包含字母或两者的混合 - 原始正则表达式确保每个类至少表示一次。似乎有人可能已经使用它来验证用户密码或类似的东西。

答案 1 :(得分:1)

这可能用于验证候选密码 -

  1. 检查它至少有10个字符
  2. 检查它是否包含至少一位数字
  3. 检查它是否包含至少一个小写字母
  4. 检查它是否包含至少一个大写字母
  5. 你的替换正则表达式并不完全相同,因为它只是对上述条件进行OR运算 - 长期讨厌的正则表达式与它们相同。也没有上述条件的命令;字母或数字可以出现在字符串中的任何位置。

    我实际上没有看到进一步简化它的方法 - 你可能会在开头删除。*而最后删除。* $因为它们实际上并没有用于任何目的。但除此之外,长期的正则表达式可以很好地结合这些条件而不强加订单。

答案 2 :(得分:1)

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

整个正则表达式中最重要的部分是(?=...)运算符,它匹配,但不消耗它匹配的字符串部分。因此,彼此相邻的多个(?=...)充当AND运算符。

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

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

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

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

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

你可以看到它听起来比它应该更复杂,尤其是子串部分。实际上,.*之后的^部分不是必需的,我们可以将其简化为

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

答案 3 :(得分:0)

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

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

删除前导.*后,正则表达式从不必须回溯(除非您计算成功后瞻性回溯后返回起始位置)。至于最后的.*$,可能没有必要,但也没有任何伤害。我会留下它,以防有人试图使用匹配的结果而不是原始字符串。

还有一点:您可以通过删除第一个前瞻并将.{10,}放在.*的位置来使正则表达式更简洁:

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

它的编写方式是在Internet Explorer(ref)中解决长期存在的错误。这个bug终于在IE8或IE9中被修复了,但我会保留原样,以防万一。