为什么正则加了g修饰符不能正确检测input内容?

图片描述

图片描述

如图,我在第1个1后面输入了一个非法字符空格,但是在后面每当输入偶数个字符的时候能够检测出来,输入奇数个字符的时候不能检测出来,为什么? (不加g修饰符是没问题的,但是加了g也不应该检测不出来啊?)

图片描述

这是我用控制台调试的结果

代码:

window.onload=function(){
var re=/[^0-9A-Za-z\u4E00-\u9FA5]/g;  //正则加了g修饰符
username.onkeyup=function(){
    //判断输入内容的语句
    if (re.test(this.value)) {
        console.log(this.value); //控制台调试语句
        name_msg.innerHTML='<img class="notice" src="./images/notice_red.png">含有非法字符';
    }else if (this.value==="") {
        name_msg.innerHTML='<img class="notice" src="./images/notice_red.png">不能为空';
    }else{
        name_msg.innerHTML='<img class="notice" src="./images/ok_green.png">';
    }
}
}
阅读 2.3k
2 个回答

因为全局匹配模式进行一次成功匹配后会保存上一次匹配到的位置为lastIndex,下一次从lastIndex开始匹配。
所以第一次匹配到之后,下一次如果后半段没有非法字符,就会匹配失败,然后在下一次又回复正常。

楼上说的很好了...你可以拿同一个含有空格的输入连续测试,你会发现结果是变的。每一次测试后通过re.lastIndex可以获取上次匹配的位置,你会发现这个值也是变的,原因就是楼上说的了。

可以用全部合法字符的正则来检测

var re = /^[0-9A-Za-z\u4E00-\u9FA5]*$/
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题