我有以下正则表达式:
(?=.{8,})[a-zA-Z]+[^a-zA-Z]+|[^a-zA-Z]+[a-zA-Z]+
我不明白它的“?=”部分。
我的基本(不正确)理解是它说的是一个长度为8个字符或更长的字符串,其中有一个或多个字母后跟一个或多个非字母,或者一个或多个非字母后跟一个字符或者更多信件。我的理解显然不正确。
引擎是.NET。
任何帮助都将不胜感激。
答案 0 :(得分:5)
它看起来像一个简单的密码最小强度验证程序。它匹配任何长度至少为8个字符且包含至少一个字母和一个非字母(以任何顺序)的内容。
(?= ..)是lookahead必须匹配,但不消耗任何字符。如果少于8个字符,则前瞻失败,因此整个匹配失败。如果前瞻成功,其余的正则表达式仍然必须匹配,但它从头开始检查,因为尚未消耗任何字符。
如果你在没有前瞻的情况下编写它,术语.{8,}
将消耗字符串中的所有字符,因此表达式的其余部分将不会留下任何内容,因此它总是会失败。 / p>
编写此表达式的另一种方法是:
^(?=.{8})(?=.*?[a-zA-Z])(?=.*?[^a-zA-Z])
这只使用前瞻,但含义大致相同。
我还在开头添加了一个锚^
,以避免在匹配失败时进行额外的搜索。
答案 1 :(得分:2)
?=
部分开始positive lookahead,这意味着括号中的其他内容需要显示在此处,但不会消耗匹配中的任何字符。
基本上,正如您已经指出的那样,部分(?=.{8,})
要求字符串长度至少为8个字符。
之后你有一个替换,它至少匹配一个ASCII拉丁字母,后跟至少一个非字母或至少一个非字母,后跟至少一个ASCII拉丁字母。
我不太确定交替,可能是开头的前瞻,要求字符串长度至少为8个字符,只有在字符串以字母开头时才需要。