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

我申明了一个正则对象: 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);
阅读 2.6k
1 个回答

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

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

  • 避免使用 g 标志
  • 设置正则对象的 lastIndex 为 0

这里演示第二种方法

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"]

这就正常了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题