5

次のコードがあります。

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 が含まれる理由を理解しようとしています。なぜ2回取得するのですか?

すべての「潜在的な」価格を 1 つだけ取得したいので、たとえば、次の文字列があるとします。

var str = "$123 $149 $150";それはそのようになります:

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

それだけで、見つかった配列にはそれ以上の一致はありません。

ここで何が起きてるの?私は何が欠けていますか?

4

3 に答える 3

7

これは、式全体が括弧で囲まれているためです。これは、キャプチャされたグループを定義します。

gフラグを使用しない場合はmatch、配列で返されます:

  • パターンに一致する場合は文字列全体
  • キャプチャされたグループ

ここで、キャプチャされたグループは文字列全体です。

あなたが望んでいるように見えるのは

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

返す

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

参考:正規表現とフラグに関するMDN

于 2013-10-29T17:17:05.123 に答える
6

まずはフルマッチです。

2 番目は、定義した外側のサブグループを表します。これは、この場合の完全一致と同じです。

その特定のサブグループは実際には必要ないように見えるので、削除できるはずです。内側のグループには、特定の文字列に一致するものはありません。


参考までに、グループを使用したいが非キャプチャにしたい場合は、グループ?:の先頭に追加できます。

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

繰り返しますが、ここのグループはあまり役に立ちませんが?:、使用されていることを示しています。

于 2013-10-29T17:16:36.870 に答える
2

g正規表現の最後にフラグを追加します。それ以外の場合は、最初の一致のみがキャプチャされます。ではg、サブグループはキャプチャされません。その必要はありません。正規表現の外側の括弧は実際には何もしません。

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

でサブグループのキャプチャを明示的に抑制することができますが、フラグ(?:では問題ありません。g

于 2013-10-29T17:19:23.620 に答える