为什么在Javascript中使用'match'时,正则表达式会返回两次值?

5

I have the following code:

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

alert(found[1]);
alert(found[0]);

我正在尝试理解为什么found [0]和found [1]会包含$ 123。为什么它会得到两次?
我想一次获取所有“可能的”价格,例如如果我有这个字符串:
var str =“$ 123 $ 149 $ 150”; 它应该是:
found[0] = $123
found[1] = $149
found[2] = $150

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

这里发生了什么?我错过了什么吗?

3个回答

7

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

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

  • 如果匹配模式,则返回整个字符串
  • 捕获的组

在这里,捕获的组是整个字符串。

您似乎想要的是

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

它返回

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

参考文献: MDN关于正则表达式和标志的解释


6
第一个是完全匹配。 第二个表示您定义的外部子组,在您的情况下与完全匹配相同。 那个特定的子组似乎并不必要,因此您应该能够删除它。内部组没有与您的特定字符串匹配的结果。
FYI,如果您想使用一组,但使其不捕获,请在其开头添加“?:”。
var re = /(?:\$[0-9]+(\.[0-9]{2})?)/;

再次强调,这里的代码段并没有什么用,但是展示了三目运算符?:的使用。


3
g标记添加到正则表达式的末尾。 否则,只有第一个匹配项将被捕获。 使用g,子组不会被捕获。 您不需要它们; 正则表达式中的外括号实际上并没有起到任何作用。
var re = /\$[0-9]+(\.[0-9]{2})?/g;

您可以使用(?:来明确禁止子组捕获,但在使用g标志时并不重要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接