引言
在我们使用正则表达式时,一般都是简单的写一个取匹配,大致可以参考 雪大大的官方网站, 但是这个网站讲的仅仅是最基本的语法的运用,这不昨天同事就给提了一个需求,给了我几个字符串,具体为:001A01,101A11 ...以此类推,即前三位为数字,后两位为数字,第四位为大写英文字母的 6 个字符的字符串,当然,还有个隐藏条件,一开始没告诉我,就是前三位或者后两位的数字不能为 000 或者 00,所以像 000A01,001A00,000A00 都是不符合条件的,所以,在没有了解这个条件时,我果断写下了如下的正则表达式
于是,在交付同事之后,得到了能不能加上这个隐藏条件的需求,于是,我就开始犯愁了...
正题
所谓不破不立,要想实现这个看似简单的需求,确实要打破之前的一些束缚才行,正则一般都用来匹配符合条件得字符,不符合真的很少用到,于是网上查阅了大量的资料,终于得出了可以使用下括号将多个正则表达式连接的思路,前提时小括号里面必须有类似 ?!, ?=,加起来大致是(?=^abc$),(?!^abc$),于是我才用了多个正则合并的方式,实现了这个需求,具体正则如下
虽然看似很长,其实拆分一下,大致也就是3个正则进行了合并,最后的意思如英文所示,即满足第一个正则并且不满足第二个和第三个正则的一个匹配。
结尾
再补充一种,就是很多时候我们要用正则判断多次重复的一个字母或者数字之类的,这时候我们可以写成(类型)\1{n}的形式,这个n是重复当前字母几次的意思,比如AA,意思就是要重复当前字母A一次,那么这时候n就是1就可以了,\1可以暂时理解成固定写法,重复就用\1,我们想判断字符串AAC中是否存在连续且重复的字母,那么我们就可以
const reg = /(A-Z)\1{1}/
const s = 'AAC'
reg.test(s)