js正则RegExp使用g全文扫描匹配多项模式的坑

时间:2021-11-09 07:39:02

数据是这样:

简山尼,13591773474;多遥山伯,13591773474;周玉兰,13000000004;陈雪梅,13901193472;张可高,13900139000;


代码如下:

function PatternNumbers(){
var val=$('#numbers').val();
var strs = new Array();
strs = val.split(";");
var pattern="^([\\w|\\u4e00-\\u9fa5]+,(\\d{2,3}-)?0?(13|14|15|18)[0-9]{9})+";
var regex = new RegExp(pattern,"g");
for(var i = 0 ;i <strs.length;i++){
alert(""+i+":"+strs[i]);
if(i!=strs.length-1&&!regex.test(strs[i])){
alertInfo("提示","电话格式出错");
return false;
}
}
return true;
}

使用站长工具(网址:http://tool.chinaz.com/regex)测试,每个都是格式正确的

js正则RegExp使用g全文扫描匹配多项模式的坑

js正则RegExp使用g全文扫描匹配多项模式的坑js正则RegExp使用g全文扫描匹配多项模式的坑


却总是在第二个匹配出错。原因是在创建正则表达式对象时如果使用了“g”标识符或者设置它了的global属性值为ture时,那么新创建的正则表达式对象将使用模式对要将要匹配的字符串进行全局匹配。在全局匹配模式下可以对指定要查找的字符串执行多次匹配。每次匹配使用当前正则对象的lastIndex属性的值作为在目标字符串中开始查找的起始位置。 lastIndex属性的初始值为0,找到匹配的项后lastIndex的值被重置为匹配内容的下一个字符在字符串中的位置索引,用来标识下次执行匹配时开始查找的位置。如果找不到匹配的项lastIndex的值会被设置为0。 当没有设置正则对象的全局匹配标志时lastIndex属性的值始终为0,每次执行匹配仅查找字符串中第一个匹配的项。可以通过regex.lastIndex来访问在执行匹配相应的lastIndex 属性的值。

所以第二次匹配第二字符串时是以第二个字符串的lastIndex起始的部分开始匹配的,所以会 

这里解决很简单,以

var regex = new RegExp(pattern);
创建正则对象,不使用g模式即可