背景
开发中碰到一个正则校验的需求:校验银行卡的格式。想来很简单,不就是搜一个正则然后test一下就完事了吗?于是乎......
好了,找到了赶紧写完,然后就发现了问题:
const cardNumberRegex = /^\d{16}|\d{19}$/;
console.log(cardNumberRegex.test('1234567890123456+')); // 应该输出:false
但是发现输出位true,纳了闷了这不是长度为16或者19的纯数字组合吗?
询问了一下通义千问发现它也不知道...
然后我就去试了下
测试正则表达式如下,目的是校验两位或者四位的纯数字组合。
const regex = /^\d{2}|\d{4}$/
regex.test("1") // false
regex.test("12") // true
regex.test("123") // true
regex.test("1234") // true
regex.test("12+") // true ???
regex.test("1+") // false
regex.test("++") // false
解决办法
又不信邪地试了几次,总算发现了端倪:
^ 在正则表达式中表示 开始
$ 在正则表达式中表示 结束
| 在正则表达式中表示 或者
然后原来的正则好像就被很合理地拆成了两部分:
理解一下就是以16个纯数字开始 或者 以19个纯数字结束,试了一下果然,所以解决办法就是:
const regex = /^(\d{16}|\d{19})$/
反思总结
括号不仅仅是在语法上进行约束,更是在逻辑上帮助理解,更容易看清其中的含义
虽然是很基础的语法,但是是一个终身的好习惯~