match函数返回两个元素而不是一个元素的数组

时间:2017-05-10 10:05:20

标签: javascript regex match

我有这样一句话:

\/Date(1475832958000)\/

我想从中提取一个数字。我这样做了:

var regex = /(\d+)/;
var str = '\/Date(1475832958000)\/';
console.log(str.match(regex));
//["1475832958000", "1475832958000"]

我得到一个包含2个元素的数组。我不懂为什么。请帮忙。

2 个答案:

答案 0 :(得分:2)

在正则表达式() is using for capturing group中,第一个元素是完全匹配,第二个元素是捕获的值。

来自MDN docs

  

包含整个匹配结果和任何括号捕获的匹配结果的数组;如果没有匹配则为null。

如果您只想在括号内获取数字,请转义括号(通过添加反斜杠,\)。

var regex = /\(\d+\)/;
var str = '\/Date(1475832958000)\/';
console.log(str.match(regex));

// or in case you just want to get the number 
// then use capturing group
var regex1 = /\((\d+)\)/;
console.log(str.match(regex1));

答案 1 :(得分:1)

因为正则表达式中的()定义了捕获组match返回一个数组,其中匹配位置0的整个正则表达式,后跟捕获组中匹配的任何内容作为后续条目。

您可能希望正则表达式为/^\/Date\((\d+)\)\/$/,并将[1]处的结果用作数字:

var str = '/Date(1475832958000)/';
var rex = /^\/Date\((\d+)\)\/$/;
var result = str.match(rex);
if (result) {
  var num = result ? +result[1] : null;
  console.log("Number: " + num);
  var dt = new Date(num);
  console.log("Date: " + dt.toString());
}

正则表达式/^\/Date\((\d+)\)\/$/表示:

  • ^ - 输入开始
  • \/Date\( - 文字/Date(。我们必须转义/,否则它会终止正则表达式,我们必须转义(所以它是文字(而不是启动捕获组。
  • (\d+) - 捕获一个或多个数字的捕获组。
  • \)\/ - 文字)/
  • $ - 输入结束

附注:字符串文字\/中的'\/Date(1475832958000)\/'只是/ s,不需要反斜杠。 '\/Date(1475832958000)\/''/Date(1475832958000)/'是完全相同的字符串。