有人可以帮我理解这个正则表达吗?

时间:2010-01-27 14:08:28

标签: .net regex

我有以下正则表达式:

(?=.{8,})[a-zA-Z]+[^a-zA-Z]+|[^a-zA-Z]+[a-zA-Z]+

我不明白它的“?=”部分。

我的基本(不正确)理解是它说的是一个长度为8个字符或更长的字符串,其中有一个或多个字母后跟一个或多个非字母,或者一个或多个非字母后跟一个字符或者更多信件。我的理解显然不正确。

引擎是.NET。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:5)

它看起来像一个简单的密码最小强度验证程序。它匹配任何长度至少为8个字符且包含至少一个字母和一个非字母(以任何顺序)的内容。

(?= ..)是lookahead必须匹配,但不消耗任何字符。如果少于8个字符,则前瞻失败,因此整个匹配失败。如果前瞻成功,其余的正则表达式仍然必须匹配,但它从头开始检查,因为尚未消耗任何字符。

如果你在没有前瞻的情况下编写它,术语.{8,}将消耗字符串中的所有字符,因此表达式的其余部分将不会留下任何内容,因此它总是会失败。 / p>

编写此表达式的另一种方法是:

^(?=.{8})(?=.*?[a-zA-Z])(?=.*?[^a-zA-Z])

这只使用前瞻,但含义大致相同。

我还在开头添加了一个锚^,以避免在匹配失败时进行额外的搜索。

答案 1 :(得分:2)

?=部分开始positive lookahead,这意味着括号中的其他内容需要显示在此处,但不会消耗匹配中的任何字符。

基本上,正如您已经指出的那样,部分(?=.{8,})要求字符串长度至少为8个字符。

之后你有一个替换,它至少匹配一个ASCII拉丁字母,后跟至少一个非字母至少一个非字母,后跟至少一个ASCII拉丁字母。

我不太确定交替,可能是开头的前瞻,要求字符串长度至少为8个字符,只有在字符串以字母开头时才需要。