检测一批手机号码是否都符合要求的格式,循环用正则校验,发现无效。去查找了下资料,发现了之前没有注意到地方。
下面是问题重现:
const arr=['18311112222','18344445555','2857898098']
const reg = /^1[3-9]\d{9}$/g;
const result = arr.find(ele => !reg.test(ele));
console.info({result});
// {result: "18344445555"}
按照上面的正则,第二个号码符合要求,却返回了 false
,去查了资料,发现:
如果正则表达式设置了全局标志g
,test()
的执行会改变正则表达式lastIndex
属性。连续的执行test()
方法,后续的执行将会从lastIndex
处开始匹配字符串。
验证一下:
const arr=['18311112222','18344445555','2857898098']
const reg = /^1[3-9]\d{9}$/g;
const result = arr.find(ele => {
const lastIndex = reg.lastIndex;
console.info({lastIndex});
return !reg.test(ele);
});
// {lastIndex: 0}
// {lastIndex: 11}
去掉全局标志 g
,再想一想这个场景下没有必要使用全局匹配。
使用 String.prototype.search() 。
const arr=['18311112222','18344445555','2857898098']
const reg = /^1[3-9]\d{9}$/g;
const result = arr.find(ele => ele.search(reg) === -1);
每次循环匹配的时候,重新声明一个正则。
const arr=['18311112222','18344445555','2857898098']
const result = arr.find(ele => {
const reg = /^1[3-9]\d{9}$/g;
return !reg.test(ele);
});
打开纯文本代码链接时,自动高亮代码,支持191种语言,97个主题 特性 支持191种...
前言: 不知多久能学会 Elisp 上一章: 动态模块 从本章开始,进入这份 Elisp 教...
本文是介绍 RecyclerView 入门基础 系列文章 的第四篇。如果您已经对创建 Recycl...
为表达全国各族人民对抗击新冠肺炎疫情斗争牺牲烈士和逝世通报的深切哀悼,国务...
在CSS中,根据元素显示模式的不同元素标签被分为了两类:行内元素(inline-level...
在HTML5中,我们可以使用drawImage方法在canvas上进行画图操作,其基本代码如下...
前言 在制作顶部菜单的时候,都会要求制作弹出的二级菜单,早先的做法是用jQuery...
简介 处理大量并发是 Go 语言的一大优势。语言内置了方便的并发语法,可以非常方...
微信搜索【 脑子进煎鱼了 】关注这一只爆肝煎鱼。本文 GitHub github.com/eddycj...
【内容】: 1.利用background-image 渐变样式 2.可以利用scale缩放 3.给伪元素设...