【问题标题】:String.prototype.match differences between Chrome/Safari & FireFoxChrome/Safari 和 FireFox 之间的 String.prototype.match 区别
【发布时间】:2015-07-13 20:28:20
【问题描述】:

我有一个非常简单的正则表达式,

"lang-bash".match("lang-([a-z]+)", "gi")

在最新的 Chrome(43-ish)上,我得到了 ["lang-bash", "bash"] 的预期行为。当我在最新的 FireFox(39 或 41a)上尝试相同时,我得到 ["lang-bash"]。我也在 Safari (8.0.7) 中试过这个,它的预期结果是["lang-bash", "bash"]

所以这可能是 FireFox 中的一个错误,我可以提交它,但我希望这只是我不理解的东西。谢谢!

编辑:好的……所以再做一些测试。

火狐

"lang-bash lang-dash".match(/lang-([a-z]+)/i)
Array [ "lang-bash", "bash" ]
"lang-bash lang-dash".match(/lang-([a-z]+)/ig)
Array [ "lang-bash", "lang-dash" ]
"lang-bash lang-dash".match("lang-([a-z]+)", "gi")
Array [ "lang-bash", "lang-dash" ]

野生动物园

"lang-bash lang-dash".match(/lang-([a-z]+)/i)
[ "lang-bash", "bash" ]
"lang-bash lang-dash".match(/lang-([a-z]+)/ig)
[ "lang-bash", "lang-dash" ]
"lang-bash lang-dash".match("lang-([a-z]+)", "gi")
["lang-bash", "bash"]

"lang-bash".match(/lang\-([a-z]+)/i)
["lang-bash", "bash"]
"lang-bash".match(/lang\-([a-z]+)/gi)
["lang-bash"]
"lang-bash lang-dash".match("lang-([a-z]+)", "gi")
["lang-bash", "bash"]

由于有捕获,我希望任何带有 ig 标志的结果都是 [ "lang-bash", "lang-dash", "bash", "dash" ],但我想这根本不正确。似乎所有浏览器在这里的行为都不同。有人知道发生了什么吗?

【问题讨论】:

  • 这看起来像是一个从第 0 组到第 1 组的捕获数组。您期待什么?在某些语言中,match 将匹配整个字符串,因此全局 g 选项毫无意义。也许您正在寻找搜索或查找。
  • g 不应该没有意义,因为我的输入可能有多个值。只是我给出的例子没有。制作一个更有意义的输入字符串让我更加困惑。我真的只关心捕获。

标签: regex google-chrome firefox safari


【解决方案1】:

最初,Firefox 在String.prototype.{search, match, replace} 中实现了非标准的flags 参数。这个参数将是deprecated in Firefox 39 and will be removed in future version。在bug report 中查看有关此问题的更多信息。

您在 Firefox 中看到的内容是由于 flags 参数的影响。

match 与全局g 模式一起使用时,仅包含主要匹配项。如果没有全局标志,match 会返回索引 0 中的第一个匹配项以及索引 1 中的捕获文本。

由于 Firefox 知道 flags 参数,它返回所有主要匹配项而不包括捕获组,如下所示:

"lang-bash lang-dash".match("lang-([a-z]+)", "gi")
"lang-bash".match("lang-([a-z]+)", "gi")

其他浏览器忽略flags参数,所以结果只显示第一个匹配和捕获组。

如果您需要标志,请在 RegExp 文字(如果模式是固定的)或 RegExp 构造函数(如果模式是动态的)中指定它。

【讨论】:

  • 这是很棒的背景信息。还有,真是一团糟。
【解决方案2】:

好的,看来我只是在研究不同的浏览器如何处理 match 或者它们在记录时如何显示数据。

function getMatches(string, regex, index) {
  index || (index = 1); // default to the first capturing group
  var matches = [];
  var match;
  while (match = regex.exec(string)) {
    matches.push(match[index]);
  }
  return matches;
}
getMatches("lang-bash lang-dash", /lang\-([a-z]+)/ig)

在 Chrome、Safari、FireFox 和 Node.js 中具有相同的值 [ 'bash', 'dash' ]。感谢 How do you access the matched groups in a JavaScript regular expression? 提供的代码让我探索了这个选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多