javascript regexp一个奇怪的行为

时间:2015-04-24 02:15:29

标签: javascript regex

HTML:

<input type="text" id="txt" value="15228868227"><button id="btn">check</button>

JavaScript的:

//email
var rMail = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/g;
//phone
var rPhone = /^(13[0-9]|15[0236789]|18[8|9])\d{8}$/g;

document.getElementById('btn').onclick = function(){
    var sTxt = document.getElementById('txt').value;

    var bMail = rMail.test(sTxt);
    var bPhone = rPhone.test(sTxt);
    if(bMail || bPhone){
        alert('phone number or email')
    };
    // console.log(!rMail.test(sTxt) && !rPhone.test(sTxt));
    if(!bMail && !bPhone){
        alert('Neither phone number nor the emial')
    };
};

当我点击按钮时,第一次结果是电话号码或电子邮件&#39; - 这就是我想要的。然后我没有改变任何东西,只是再次点击,结果是“电话号码和电子邮件都没有!”如果我删除了评论,结果始终是电话号码或电子邮件&#39;。为什么呢?

1 个答案:

答案 0 :(得分:2)

摆脱正则表达式的g选项。它会影响行为。

g选项意味着您希望正则表达式记住上一个匹配结束的位置,并且您希望它在搜索字符串中从那里开始以进行下一个匹配。您显然不需要在代码中使用该行为。

您可以通过查看正则表达式对象的.lastIndex属性来验证这一点。在第一次成功匹配后,它将具有非零值。该值被解释为搜索字符串中下次尝试匹配时开始的位置。因为.lastIndex是在正则表达式对象本身上维护的,所以您基本上会忽略针对可能不同的搜索字符串进行测试的事实。

哦,你的console.log()调用使其有效的原因是,当.lastIndex超出字符串的结尾时,它会重新开始{ {1}}!