描述:给一个input框的内容匹配一个正则,匹配内容为产品激活码。
类似这样子:“0C31-0B81-BB32-3094-0C31-0B81-BB32-3094”
代码:
$('#licenseCode').keyup(function () {
let licenseCode = $(this).val();
let reg = /^([A-Z0-9]{4}-){7}[A-Z0-9]{4}$/g;
console.log(reg.test(licenseCode));
console.log(reg.test(licenseCode));
console.log(reg.test(licenseCode));
console.log(reg.test(licenseCode));
if (reg.test(licenseCode)) {
checkBtn.removeAttr("disabled");
console.log(11);
} else {
checkBtn.attr("disabled", "disabled");
console.log(22);
}
});
输入结果却令我大吃一惊!
一直想不通为什么会是true,false,true,false!!!!
如果我在增加一行console.log();
$('#licenseCode').keyup(function () {
let licenseCode = $(this).val();
let reg = /^([A-Z0-9]{4}-){7}[A-Z0-9]{4}$/g;
console.log(reg.test(licenseCode));
console.log(reg.test(licenseCode));
console.log(reg.test(licenseCode));
console.log(reg.test(licenseCode));
console.log(reg.test(licenseCode));
if (reg.test(licenseCode)) {
checkBtn.removeAttr("disabled");
console.log(11);
} else {
checkBtn.attr("disabled", "disabled");
console.log(22);
}
});
输出结果会这样子:
想不通!!!!为什么?
因为
/g
的原因当设置全局标志的正则使用test()
如果正则表达式设置了全局标志,test() 的执行会改变正则表达式 lastIndex属性。连续的执行test()方法,后续的执行将会从 lastIndex 处开始匹配字符串,(exec() 同样改变正则本身的 lastIndex属性值).
参考https://developer.mozilla.org...