为什么这条正则全局匹配是错的?

WytheChan
  • 766

为什么这条正则全局匹配是错的?
原码如下:

var str='13662890478';
        var reg=/^1[3|5|8]\d{9}/g;
        var result=reg.exec(str);
        if(reg.test(str)){
            console.log('对')
            console.log(result[0])
        }else{
            console.log('错')
            console.log(result[0])
        }

图片描述

回复
阅读 2.3k
4 个回答
maolion
  • 218
✓ 已被采纳

/^1[3|5|8]\d{9}$/; // 修正一下你的正则, 这样会可靠点 如果只是为了验证手机号格式

带g 的如果用了 exec 一个字符串做匹配,会有缓存问题,按你想要的效果,你可以在 reg.test(str) 之前 把 reg.lastIndex = 0; 这个用上

应该是lastIndex的问题,因为你已经使用exec调用过一次,正则的lastIndex变了,再次调用test就会出现这种情况。

var str='13662890478';
var reg=/^1[3|5|8]\d{9}/g;
reg.test(str) // true
reg.test(str) // false

你会发现多次调用会false和true循环变化。

js 正则匹配在全局匹配模式下可以对指定要查找的字符串执行多次匹配。每次匹配使用当前正则对象的lastIndex属性的值作为在目标字符串中开始查找的起始位置。lastIndex的初始值为0,找到匹配的项后lastIndex的值被重置为匹配内容的下一个字符在字符串中的位置索引,如果找不到匹配的项lastIndex的值会被设置为0。你说的情况是正好在lastIndex为11的值,你可以这样测试下:

var str='13662890478';
var reg=/^1[3|5|8]\d{9}/g
console.log(reg.lastIndex)
console.log(reg.test(str))
console.log(reg.lastIndex)      
console.log(reg.test(str))
console.log(reg.lastIndex)
console.log(reg.test(str))
console.log(reg.lastIndex)      
console.log(reg.test(str))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏