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

发布于 2022-09-01 13:02:58 字数 755 浏览 13 评论 0

我申明了一个正则对象: 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);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

红ご颜醉 2022-09-08 13:02:58

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

这就正常了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文