这几个概念一看到就脑壳痛!网上有很多很专业的解释,我就不去抄了。给大家浅尝辄止的来看一下怎么使用。其它这个东西非常有用。

举个例子,我想验证一个密码,必须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

后面不是数字:

正则表达式的零宽度前置断言和后置断言,本文就介绍到这里,希望对大家有所帮助!

03-14 10:08