【问题标题】:.match in JavaScript not working as intendedJavaScript 中的 .match 未按预期工作
【发布时间】:2016-08-30 10:22:09
【问题描述】:

假设以下代码:

"ab00ab____ab01ab".match(/ab(.+)ab/);

我想让我得到0001,但它却返回给我这个:

["ab00ab____ab01ab", "00ab____ab01"]

我该如何解决这个问题?

【问题讨论】:

标签: javascript regex


【解决方案1】:

在带有/ab(.+?)ab/g 正则表达式的循环内使用RegExp#exec

var s = "ab00ab____ab01ab";
var re = /ab(.+?)ab/g;
var res = [];
while ((m=re.exec(s)) !== null) {
  res.push(m[1]);
}
console.log(res);

首先,你需要一个惰性点匹配模式(.*?.+?)来匹配第一个ab,而不是一个贪婪的(.+)匹配到最后一个ab .此外,使用String#match 和带有全局修饰符的正则表达式,您会丢失所有捕获(那些与带括号的正则表达式模式部分匹配的子字符串),您只能将它们与RegExp#exec 一起使用。

【讨论】:

  • @MarioAlexandroSantini:你错了,因为我的正则表达式不匹配空字符串。每次成功匹配后,RegExp 类的lastIndex 属性会自动升级。如果没有匹配,mnull
  • 问题不在于你有一个空字符串。在这种情况下,您只需跳过一段时间。我在想 re.exec() 总是匹配为无限循环的结果。无论如何,您的代码很危险,就像您从正则表达式中删除 g 标志一样,您有一个无限循环。
  • @MarioAlexandroSantini:如果我要从正则表达式中删除/g,我将不会使用RegExp.exec 因为如果您使用的正则表达式没有带有RegExp#exec 的全局修饰符lastIndex 属性不会自动升级。在发布这些 cmets 之前,您应该已经阅读了 RegExp#exec 行为。你做出了错误的假设,这段代码是完全安全的它不会陷入无限循环
  • 这就是重点,在您的示例中,一切都很好,只有几行代码。在现实世界的代码中,正则表达式可以动态分配,也可以在您使用的数百或数千行代码之外分配。所以可能不太明显,删除 g 标志将导致无限循环。这是因为正则表达式随输入数据而变化。但这只是对更强大的代码的考虑。无论如何,谢谢,因为我今天学到了一个新的想法。
  • 如果 OP 提到任何关于模式重用的内容,我会推荐一些不同的东西。目前,该解决方案是针对当前任务量身定制的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
相关资源
最近更新 更多