3

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

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

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

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

编辑

我也不知道它是什么意思验证,但看看我认为它做了什么,正则表达式可以简化为:

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

编辑 2 我注意到我的替换正则表达式不能确保我至少满足每个要求中的一个(至少一个数字、大写和小写字母)。有什么方法可以调整它,以便正则表达式也能做到这一点,还是只有原始正则表达式才有可能?

4

4 回答 4

6

我可以解释正则表达式的各个部分的作用,但总的来说,我觉得这很奇怪:

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

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

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

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

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

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

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

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

如果这一切都是真的,那么:

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

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

到您的编辑

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

于 2012-05-31T07:26:07.903 回答
1

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

  1. 检查它是否至少有 10 个字符长
  2. 检查它是否包含至少一位数字
  3. 检查它是否包含至少一个小写字母
  4. 检查它是否包含至少一个大写字母

您的替换正则表达式并不相同,因为它只是对上述条件进行 OR - 长讨厌的正则表达式与它们。上述条件也没有顺序;字母或数字可以出现在字符串中的任何位置。

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

于 2012-05-31T07:27:46.903 回答
1

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

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

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

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

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

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

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

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

^(?=.{10,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$
于 2012-05-31T07:42:11.477 回答
0

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

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

删除前导.*后,正则表达式永远不必回溯(除非您在成功的前瞻回溯后计算返回到起始位置)。至于.*$最后的,可能没有必要,但也没有坏处。我会把它留在里面,以防有人试图将匹配的结果用于某些东西而不是原始字符串。

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

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

之所以这样写,是为了解决 Internet Explorer ( ref ) 中长期存在的错误。该错误最终在 IE8 或 IE9 中得到修复,但我会保持原样,以防万一。

于 2012-05-31T08:56:17.763 回答