标签:arr const 无效 lastIndex ele 正则 test 匹配 reg
引子
检测一批手机号码是否都符合要求的格式,循环用正则校验,发现无效。去查找了下资料,发现了之前没有注意到地方。
问题
下面是问题重现:
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}
解决方法
方法 1
去掉全局标志 g
,再想一想这个场景下没有必要使用全局匹配。
方法 2
使用 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);
方法 3
每次循环匹配的时候,重新声明一个正则。
const arr=['18311112222','18344445555','2857898098']
const result = arr.find(ele => {
const reg = /^1[3-9]\d{9}$/g;
return !reg.test(ele);
});
参考资料
标签:arr,const,无效,lastIndex,ele,正则,test,匹配,reg 来源: https://www.cnblogs.com/thyshare/p/14835722.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。