解释提到的正则表达式

Vid*_*dya 0 c# regex

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

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

据我所理解

这个正则表达式将验证 - 至少6个字符到最多10个字符 - 将逃脱像^和$这样的字符

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

JDB*_*JDB 7

^.*(?=.{6,10})(?=.*[a-zA-Z].*[a-zA-Z].*[a-zA-Z].*[a-zA-Z])(?=.*\d.*\d).*$
Run Code Online (Sandbox Code Playgroud)
  • ^被称为"锚".它基本上意味着任何后续文本必须紧跟在"输入开始"之后.因此^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}$
Run Code Online (Sandbox Code Playgroud)

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

  • 正则表达式的重要解释.来自OP的现有正则表达式看起来像是用于强制执行某种复杂性的密码验证正则表达式.从它的外观来看,它需要6到10个字符,必须包含至少4个字母和至少2个数字. (2认同)