Regex String.prototype.match Chrome/Safari和;火狐
我有一个非常简单的正则表达式Regex String.prototype.match Chrome/Safari和;火狐,regex,google-chrome,firefox,safari,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中的一个bug,我可以提交,但我希望这只是我不理解的东西。谢
"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中的一个bug,我可以提交,但我希望这只是我不理解的东西。谢谢
编辑:好的。。。所以需要更多的测试
火狐
"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”]
,但我想这根本不正确。似乎所有浏览器在这里的行为都不同。有人知道发生了什么吗?好的,看来我只是在看不同的浏览器如何处理匹配,或者它们在登录时如何显示数据
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']
中具有相同的值。感谢您的代码,让我探索了这个选项 最初,Firefox在String.prototype.{search,match,replace}
中实现了非标准的标志
参数。这一论点将是正确的。有关此问题的详细信息,请参阅中的
您在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")
其他浏览器忽略标志
参数,因此结果仅显示第一个匹配项和捕获组
如果需要这些标志,请在RegExp文本(如果模式是固定的)或RegExp构造函数(如果模式是动态的)中指定它。这看起来像是从组0到组1的捕获数组。你在期待什么?在某些语言中,match
将匹配整个字符串,因此全局g
选项没有意义。也许您正在寻找搜索或查找。g
不应该毫无意义,因为我的输入可能有多个值。只是我举的例子没有。制作一个更有意义的输入字符串让我更加困惑。我真的只是关心捕获。这是很棒的背景信息。还有,真是一团糟。