解释提到的正则表达式

时间:2013-01-17 17:08:13

标签: c# regex

任何人都可以解释下面的正则表达式,甚至在我加入之前已经在我的应用程序中使用了很长时间,而且我对正则表达式很新。

/^.*(?=.{6,10})(?=.*[a-zA-Z].*[a-zA-Z].*[a-zA-Z].*[a-zA-Z])(?=.*\d.*\d).*$/ 

据我了解

这个正则表达式将验证 - 至少6个字符,最多10个字符 - 将转义像^和$

这样的字符

另外,我的基本需求是我想要一个至少6个字符的正则表达式,其中1个字符是一个数字,另一个是特殊字符。

4 个答案:

答案 0 :(得分:7)

^.*(?=.{6,10})(?=.*[a-zA-Z].*[a-zA-Z].*[a-zA-Z].*[a-zA-Z])(?=.*\d.*\d).*$
  • ^被称为“锚点”。它基本上意味着任何后续文本必须紧跟在“输入开始”之后。因此,^B将匹配“B”但不匹配“AB”,因为在第二个“B”中不是第一个字符。

  • .*匹配0个或更多字符 - 除换行符之外的任何字符(默认情况下)。这就是所谓的贪婪量词 - 正则表达式引擎将匹配(“消耗”)所有字符到输入的末尾(或行的结尾),然后向后工作表达其余部分(它“仅在必须时放弃“字符”。在正则表达式中,一旦一个字符“匹配”,表达式的其他部分就不能再“匹配”它(除了零宽度的外观,接下来会出现)。

  • (?=.{6,10})是一个先行的锚点,它匹配输入中的位置。它在输入中找到一个位置,其中有6到10个字符,但它不会“消耗”这些字符,这意味着以下表达式可以自由匹配它们。

  • (?=.*[a-zA-Z].*[a-zA-Z].*[a-zA-Z].*[a-zA-Z])是另一个先行锚。它匹配输入中的位置,其中以下文本包含四个字母([a-zA-Z]匹配一个小写或大写字母),但任何数量的其他字符(包括零个字符)可能位于它们之间。例如:“++ a5b --- C @ D”将匹配。同样,作为一个锚,它实际上并不“消耗”匹配的字符 - 它只在文本中找到跟随字符与表达式匹配的位置。

  • (?=.*\d.*\d)另一个预测。这匹配两个数字后面的位置(中间有任意数量的其他字符)。

  • .*已经涵盖了这一个。

  • $这是另一种锚点,它匹配输入的结尾(或行的结尾 - 换行符之前的位置)。它表示前面的表达式必须匹配字符串末尾的字符。当^$一起使用时,这意味着必须匹配整个输入(而不仅仅是其中的一部分)。因此/bcd/会匹配“abcde”,但/^bcd$/与“abcde”不匹配,因为匹配中不能包含“a”和“e”。

注意

这看起来像是密码验证正则表达式。如果是,请注意它已损坏。开头和结尾的.*将允许密码任意长于10个字符。它也可以重写为更短。我相信以下内容将是可接受的(并且稍微更具可读性)替代品:

^(?=(.*[a-zA-Z]){4})(?=(.*\d){2}).{6,10}$

感谢@nhahtdh指出实现字符长度限制的正确方法。

答案 1 :(得分:2)

检查Cyborgx37的答案以获取语法解释。我会对正则表达式的含义做一些解释。

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

第一个.*是多余的,因为其余的是零宽度断言,最后以任何字符..*开头。

由于断言(?=.{6,10}),正则表达式将匹配最少6个字符。但是,正则表达式可以匹配的字符串的字符数没有上限。这是因为最后的.*(前面的.*也有贡献。)

(?=.*[a-zA-Z].*[a-zA-Z].*[a-zA-Z].*[a-zA-Z])部分断言至少有4个英文字母字符(大写或小写)。 (?=.*\d.*\d)断言至少有两位数(0-9)。由于[a-zA-Z]\d是不相交的集合,因此这两个条件合并使(?=.{6,10})成为冗余。

.*[a-zA-Z].*[a-zA-Z].*[a-zA-Z].*[a-zA-Z]的语法也是不必要的冗长。使用重复可以缩短它:(?:.*[a-zA-Z]){4}

以下正则表达式与原始正则表达式相同。但是,我真的怀疑你当前的那个和你的正则表达式的这个等价的重写做你想要的:

^(?=(?:.*[a-zA-Z]){4})(?=(?:.*\d){2}).*$

更明确的长度,因为清晰度总是更好。含义保持不变:

^(?=(?:.*[a-zA-Z]){4})(?=(?:.*\d){2}).{6,}$

回顾

  • 最小长度= 6
  • 最大长度无限制
  • 至少4个英文字母,小写或大写
  • 至少2位0-9

答案 2 :(得分:0)

<强> REGEXPLANATION

  • /.../:斜杠通常用于表示正则表达式的定义区域

  • ^:匹配输入字符串的开头

  • .:这可以匹配任何字符

  • *:匹配前一个符号0次或更多次

  • .{6,10}:将.(任何字符)与6到10次匹配

  • [a-zA-Z]:匹配az之间以及AZ之间的所有字符

  • \d:匹配数字。

  • $:匹配输入的结尾。

我认为你发布的正则表达式中的所有符号都是这样的

答案 3 :(得分:0)

对于正则表达式请求,您可以使用以下内容:

^(?=.{6,}$)(?=.*?\d)(?=.*?[!@#$%&*()+_=?\^-]).*

这里为你展开了:

^          // Anchor the beginning of the string (password).

(?=.{6,}$) // Look ahead: Six or more characters, then the end of the string.

(?=.*?\d)  // Look ahead: Anything, then a single digit.

(?=.*?[!@#$%&*()+_=?\^-]) // Look ahead: Anything, and a special character.

.*         // Passes our look aheads, let's consume the entire string.

如您所见,必须明确定义特殊字符,因为没有保留的简写符号(如\w\s\d)。以下是可接受的内容(您可以根据需要进行修改):

!, @, #, $, %, ^, &, *, (, ), -, +, _, =, ?

理解正则表达式的关键是要记住它们不会移动解析器的位置。这意味着(?=...)将开始查看最后一个模式匹配后的第一个字符,后续(?=...)将会向前看。