正则表达式的零宽度前置断言和后置断言


关键词

正则表达式 零宽度断言 前置断言 先行断言 后置断言前置断言 先行断言 后置断言 回顾断言

摘要

本文介绍正则表达式中的零宽度断言,有前置断言、后置断言,这两种又分正向断言和负向断言。

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

举个例子,我想验证一个密码,必须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
后面不是数字:
abc(?!\d)

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

 

要饭二维码

洪哥写文章很苦逼,如果本文对您略有帮助,可以扫描下方二维码支持洪哥!金额随意,先行谢过!大家的支持是我前进的动力!

文章的版权


如果您在服务器运维、网络管理、网站或系统开发过程有需要提供收费服务,请加QQ:8771947!十年运维经验,帮您省钱、让您放心!
亲,如果有需要,先存起来,方便以后再看啊!加入收藏夹的话,按Ctrl+D

« JavaScript枚举数字1-9满足某个等式的算法 javascript数组求和函数,使用reduce实现 »