首页 > 一个正则表达式,看不懂

一个正则表达式,看不懂

^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$

就是上面那个。
?=我能理解,但是外面加了开始与结束就看不懂了。


因为上来有.* 那么^似乎是多余的


就是从头到尾只能是字母和数字(至少8个),并且其中至少有一个字母和一个数字。比如它可以匹配a1234567,但不能匹配12345678abcdefgh

如果不加开始或结束限定,那么只要字符串中间有至少8个字母和数字的组合就可以匹配,但这个表达式要求的是从头至尾。例如,如果不加开始和结尾限定的话,它是可以匹配#a1234567a1234567#


对于这个^[A-Za-z\d]{8,}(?=.*[A-Za-z])(?=.*\d)$,感觉好像跟原来的是一样的,其实不然,这是一个自相矛盾的表达式。

比如字符串a1234567,原来的正则表达式^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$的匹配过程是这样的:

  1. 先匹配行起始位置,自然可以匹配成功

  2. 开始正向环视的检查,上面说过,这两个环视的功能是确认字符串中是否同时包含字母和数字,该字符串无疑是满足要求的

  3. 这里尤其注意:环视检查时所匹配到的内容不会被“吃掉”,下一步仍然从行起始位置后面开始匹配[A-Za-z\d]{8,}$,这时候当然也是可以匹配的

  4. 因此整个字符串匹配成功。

再看看修改后的表达式是如何匹配的。

  1. 先匹配行起始位置,自然可以匹配成功

  2. 再匹配[A-Za-z\d]{8,},可以匹配,此时位置指针在行尾的前面(7的后面)

  3. 开始正向环视的检查,由于整个字符串中的字符已经在第2步被匹配完,所以无法满足环视的条件,整个表达式匹配失败


上面的例子字符串正好是8个字符,那如果字符串的字符更多一些呢,比如a123456789?答案是也是不行的,因为第2步的量词是{8,}也就是说没有规定上限,它会尽量匹配,无论字符串有多少个字母+数字,都会在第2步被“吃完”,到了第3步仍然没有字符能够通过环视的检查。

那么可能你还有疑惑,我把量词限定为8会怎样?也就是说,前面我只让它匹配8个字符。很遗憾,这样也是不行的。比如用这种方式匹配a1234567b8,在第2步,它会匹配a1234567这8个字符,然后到了第3步检查环视时虽然通过了,但继续匹配最后的行结束符时却失败了,因为环视不会“吃掉”字符,匹配行结束符仍然是从b这个字符的位置上匹配的。所以我们的良苦用心无法给这个表达式任何帮助,它就是一个自相矛盾的存在,永远无法匹配成功。


上面说的应该已经比较明白了,如果有哪里不太懂的还可以问我


完全匹配


来源:链接描述

【热门文章】
【热门文章】