这几个概念一看到就脑壳痛!网上有很多很专业的解释,我就不去抄了。给大家浅尝辄止的来看一下怎么使用。其它这个东西非常有用。
举个例子,我想验证一个密码,必须6位以上,必须包含字母和数字。来看一下怎么写:
/^(?=.*\d).{6,}$/
来分析一下它:
/^$/,这个不用说了,正则的定界符和匹配字符串的开始(^)和结束($)。
.{6,},这个也好懂,那个点儿(.)代表任意的字符,只要至少有6位就OK。
关键的来了,(?=.*\d),这个是什么意思呢?不太明白。再拆分一下:
.*\d,这表示有一个数字,数字前面还可能有其它字符。但总之一句话,必须有一个数字!
那么(?=.*\d)的意思是,有一个东西,它的后面必须匹配“.*\d”,就是上面分析的――必须有数字!
再来看一下“^(?=.*\d)”,就明白它表示:指的是从字符串开头往后看,必须有数字!那就个就是我们最初的目的了!
光是做个匹配的话,还没有完全体现出断言的牛X之处!它还有一个特性叫零宽度!!意思是只做判断,不占位置!
“/^(?=.*\d).{6,}$/”这个正则表达式就可以分两部分看,一部分是检测一下必须包含数字,另一个是必须6个字符以上。这样就完美了!
再扩充一下,如果是要有字母加数字呢?
/^(?=.*\d)(?=.*[a-zA-Z]).{6,}$/,看明白了,来两个断言就好了!分别检测有没有数字、字母!
因为上的断言是跟在“^”之后的,所以叫先行断言,或前置断言!你没看错,就是先、前!
如果我要判断abc之前必须有一个数字,那会这样写:
(?<=\d)abc,注意:“?=”变成了“?<=”,这样就不叫先行断言了,叫回顾断言!
什么是负断言呢,就是把“?=”变成“?!”,把“?<=”变成“?<!”。意思也同样做了反向处理,就是后面没有什么或前面没有什么。
比如我要abc前面不能是数字:
(?<!\d)abc
后面不是数字:
正则表达式的零宽度前置断言和后置断言,本文就介绍到这里,希望对大家有所帮助!