我有一个非常简单的正则表达式,
"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" ]
,但我认为这根本不正确。似乎所有浏览器在这里的行为都不同。任何人都知道发生了什么?
答案 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?代码让我探索此选项。