可恶的正则表达式

76 阅读1分钟

背景

开发中碰到一个正则校验的需求:校验银行卡的格式。想来很简单,不就是搜一个正则然后test一下就完事了吗?于是乎......

image.png

好了,找到了赶紧写完,然后就发现了问题:

const cardNumberRegex = /^\d{16}|\d{19}$/;
console.log(cardNumberRegex.test('1234567890123456+')); // 应该输出:false

但是发现输出位true,纳了闷了这不是长度为16或者19的纯数字组合吗?

询问了一下通义千问发现它也不知道...

image.png

然后我就去试了下

测试正则表达式如下,目的是校验两位或者四位的纯数字组合。

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

解决办法

又不信邪地试了几次,总算发现了端倪:

^  在正则表达式中表示  开始
$  在正则表达式中表示  结束
|  在正则表达式中表示  或者

然后原来的正则好像就被很合理地拆成了两部分:

image.png

理解一下就是以16个纯数字开始 或者 以19个纯数字结束,试了一下果然,所以解决办法就是:

const regex = /^(\d{16}|\d{19})$/

反思总结

括号不仅仅是在语法上进行约束,更是在逻辑上帮助理解,更容易看清其中的含义

虽然是很基础的语法,但是是一个终身的好习惯~