这里记录下,我在初学时如何理解零宽断言(初学时,没人指导很容易想不明白)
1. 简单的定义:一个<没有宽度>位置,这个位置满足一定条件<断言>
2. 为了方便理解,看下面例子:
正则<用于密码设置>:^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,20}$
说明:匹配8~20位由0-9A-Za-z构成的字符(必须包含数字和字母)
下面解释步骤(index是int表示匹配的下标),从左到右:
^ 匹配开始(index = 0)
(?![0-9]+$) 这是一个负向零宽断言,不能以<全是数字和结尾>构成结尾的字符,从index=0往后匹配,像123456789这样的就不合法了,而像12345678a, abcdefg可以匹配
(?![a-zA-Z]+$) 这是一个负向零宽断言,不能以<字符和结尾>构成结尾的字符,仍然从index=0往后匹配,零宽断言的特点就是,匹配的位置不会被消费,index不会往后增加(满足条件即可)
[0-9A-Za-z]{8,20} 如果已经满足前面两个零宽断言,就说明从index=0开始到结束已经满足不全是(0-9),(a-zA-Z)的字符串了,这下再匹配index=0开始到结尾8~20位0-9A-Za-z
$ 匹配结束