首页 > 正则匹配时,出现的一个奇怪的问题。

正则匹配时,出现的一个奇怪的问题。

我申明了一个正则对象: var regex = /(^data-)?(.+)/gi;
然后用这个对象匹配data-属性。
第一次使用的时候是正常的,但是第二次直接使用上面已经申明过的正则对象 regex 就会出错。
一开始我认为是第一次使用之后,regex对象的值发生了变化,但是控制台输出出来是两个都是一样的。
我感觉应该是和regex的数据类型为引用类型有关,但又说不出个理由来。

var regex  = /(^data\-)?(.+)/gi;
console.log(regex);
var nName = "data-mobile";
var namesOfNode = regex.exec(nName);
console.log(namesOfNode);
console.log(regex);

var regex  = /(^data\-)?(.+)/gi;
// 加上这行代码就正常匹配,
// namesOfNode : ["data-account-name", "data-", "account-name", index: 0, input: "data-account-name"]
// 去掉就会出错,变成
// namesOfNode : ["t-name", undefined, "t-name", index: 11, input: "data-account-name"]

nName       = 'data-account-name';
namesOfNode = regex.exec(nName);
console.log(namesOfNode);

这是 exec 因为在全局模式下,在匹配后,正则对象的 lastIndex 属性发生了变化,即设置为匹配文本的最后一个字符的下一个位置。

所以当你需要使用同一正则对象匹配时,解决方法:

这里演示第二种方法

var regex  = /(^data\-)?(.+)/gi;
console.log(regex);
var nName = "data-mobile";
var namesOfNode = regex.exec(nName);
console.log(namesOfNode);

// 设置 lastIndex 为 0 即可
regex.lastIndex = 0;

nName       = 'data-account-name';
namesOfNode = regex.exec(nName);
console.log(namesOfNode);

结果如下:

/(^data\-)?(.+)/gi
["data-mobile", "data-", "mobile", index: 0, input: "data-mobile"]
["data-account-name", "data-", "account-name", index: 0, input: "data-account-name"]

这就正常了

【热门文章】
【热门文章】