Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex String.prototype.match Chrome/Safari和;火狐_Regex_Google Chrome_Firefox_Safari - Fatal编程技术网

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
不应该毫无意义,因为我的输入可能有多个值。只是我举的例子没有。制作一个更有意义的输入字符串让我更加困惑。我真的只是关心捕获。这是很棒的背景信息。还有,真是一团糟。