当前位置:主页 > 查看内容

正则多次匹配无效的问题

发布时间:2021-06-02 00:00| 位朋友查看

简介:引子 检测一批手机号码是否都符合要求的格式,循环用正则校验,发现无效。去查找了下资料,发现了之前没有注意到地方。 Origin My GitHub 问题 下面是问题重现: const arr=['18311112222','18344445555','2857898098']const reg = /^1[3-9]\d{9}$/g;const r……

引子

检测一批手机号码是否都符合要求的格式,循环用正则校验,发现无效。去查找了下资料,发现了之前没有注意到地方。

问题

下面是问题重现:

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 ,去查了资料,发现:

如果正则表达式设置了全局标志 gtest() 的执行会改变正则表达式 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);
});

参考资料


本文转自网络,版权归原作者所有,原文链接:https://segmentfault.com/a/1190000040097672
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐