为什么正则表达式在 Javascript 中使用 'match' 两次获得值?



我有以下代码:

var str = "$123";
var re = /($[0-9]+(.[0-9]{2})?)/;
var found = str.match(re);
alert(found[1]);
alert(found[0]);

我试图理解为什么找到[0]和找到[1]将包含123美元。为什么会得到两次?

我想让所有"潜在"价格只有一个,所以例如,如果我有这个字符串:

var str = "$123 $149 $150"; 它将是:

found[0] = $123
found[1] = $149
found[2] = $150

就是这样,找到的数组不会有更多的匹配项。

这是怎么回事?我错过了什么?

这是因为整个表达式周围的括号:它定义了一个捕获的组。

当您不使用 g 标志时,match 在数组中返回:

  • 整个字符串(如果与模式匹配)
  • 捕获的组

此处捕获的组是整个字符串。

你似乎想要的是

"$123 $149 $150".match(/$d+(.d{0,2})?/g)

返回

["$123", "$149", "$150"]

参考:关于正则表达式和标志的 MDN

第一个是完全匹配。

第二个表示您定义的外部子组,它与您案例中的完全匹配相同。

该特定子组似乎并不真正必要,因此您应该能够将其删除。内部组没有特定字符串的匹配项。


仅供参考,如果您想使用一个组,但使其不捕获,您可以在其开头添加?:

var re = /(?:$[0-9]+(.[0-9]{2})?)/;

同样,这里的小组对你没有多大好处,但它显示了正在使用的?:

g标志添加到正则表达式的末尾。 否则,将仅捕获第一场比赛。 使用g,子组不会被捕获。 你不需要他们;正则表达式中的外括号实际上没有任何作用。

var re = /$[0-9]+(.[0-9]{2})?/g;

您可以使用 (?: 显式禁止子组捕获,但使用 g 标志无关紧要。