Chrome / Safari& amp;之间的String.prototype.match差异火狐

时间:2015-07-13 20:28:20

标签: regex google-chrome firefox safari

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

"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中的一个错误,我可以提交,但我希望它只是我不理解的东西。谢谢!

编辑:好吧......等等一些测试。

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

Safari

"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" ],但我认为这根本不正确。似乎所有浏览器在这里的行为都不同。任何人都知道发生了什么?

2 个答案:

答案 0 :(得分:1)

最初,Firefox在$(document).ready(function(){中实现了非标准flags参数。这个论点将是deprecated in Firefox 39 and will be removed in future version。有关此问题的详情,请参阅bug report

您在Firefox中看到的是String.prototype.{search, match, replace}参数的影响。

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

由于Firefox知道match参数,它会返回没有捕获组的所有主要匹配项,如下所示:

flags

其他浏览器忽略"lang-bash lang-dash".match("lang-([a-z]+)", "gi") "lang-bash".match("lang-([a-z]+)", "gi") 参数,因此结果仅显示第一个匹配和捕获组。

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

答案 1 :(得分:0)

好的,看起来我只是看看不同浏览器如何处理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)

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