一个正则表达式,看不懂
^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$
就是上面那个。
?=我能理解,但是外面加了开始与结束就看不懂了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$
就是上面那个。
?=我能理解,但是外面加了开始与结束就看不懂了。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
就是从头到尾只能是字母和数字(至少8个),并且其中至少有一个字母和一个数字。比如它可以匹配
a1234567
,但不能匹配12345678
或abcdefgh
。如果不加开始或结束限定,那么只要字符串中间有至少8个字母和数字的组合就可以匹配,但这个表达式要求的是从头至尾。例如,如果不加开始和结尾限定的话,它是可以匹配
#a1234567
或a1234567#
的对于这个
^[A-Za-z\d]{8,}(?=.*[A-Za-z])(?=.*\d)$
,感觉好像跟原来的是一样的,其实不然,这是一个自相矛盾的表达式。比如字符串
a1234567
,原来的正则表达式^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$
的匹配过程是这样的:先匹配行起始位置,自然可以匹配成功
开始正向环视的检查,上面说过,这两个环视的功能是确认字符串中是否同时包含字母和数字,该字符串无疑是满足要求的
这里尤其注意:环视检查时所匹配到的内容不会被“吃掉”,下一步仍然从行起始位置后面开始匹配
[A-Za-z\d]{8,}$
,这时候当然也是可以匹配的因此整个字符串匹配成功。
再看看修改后的表达式是如何匹配的。
先匹配行起始位置,自然可以匹配成功
再匹配
[A-Za-z\d]{8,}
,可以匹配,此时位置指针在行尾的前面(7
的后面)开始正向环视的检查,由于整个字符串中的字符已经在第2步被匹配完,所以无法满足环视的条件,整个表达式匹配失败
上面的例子字符串正好是8个字符,那如果字符串的字符更多一些呢,比如
a123456789
?答案是也是不行的,因为第2步的量词是{8,}
也就是说没有规定上限,它会尽量匹配,无论字符串有多少个字母+数字,都会在第2步被“吃完”,到了第3步仍然没有字符能够通过环视的检查。那么可能你还有疑惑,我把量词限定为8会怎样?也就是说,前面我只让它匹配8个字符。很遗憾,这样也是不行的。比如用这种方式匹配
a1234567b8
,在第2步,它会匹配a1234567
这8个字符,然后到了第3步检查环视时虽然通过了,但继续匹配最后的行结束符时却失败了,因为环视不会“吃掉”字符,匹配行结束符仍然是从b
这个字符的位置上匹配的。所以我们的良苦用心无法给这个表达式任何帮助,它就是一个自相矛盾的存在,永远无法匹配成功。上面说的应该已经比较明白了,如果有哪里不太懂的还可以问我
完全匹配
因为上来有.* 那么^似乎是多余的
来源:链接描述