31514
キャプチャグループを含む正規表現を `String.prototype.match()`
に渡すと、戻り値の配列から各グループのキャプチャ文字列を取り出せます。

```

    console.log("a123b456".match(/(\d+)|(.+?)/));
    // => ["a", undefined, "a"]
    
```

一方gオプションを付けると、各マッチ回のマッチ文字列全体しか入っていないようです。

```

    console.log("a123b456".match(/(\d+)|(.+?)/g));
    // => ["a", "123", "b", "456"]
    
```

Rubyでいう次のコードのように、キャプチャグループも個別に取得する方法はありますか？

```

    p "a123b456".scan(/(\d+)|(.+?)/)
    # => [[nil, "a"], ["123", nil], [nil, "b"], ["456", nil]]
    
```
CC BY-SA 3.0
2016-12-29T03:27:00.173
31512
2016-12-29T04:07:53.457
8000
question
javascript
gオプションを使った正規表現で、グループごとのキャプチャ文字列を取り出したい
キャプチャ文字列を取り出したい時は
[`Regexp.prototype.exec()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec)
を使います。

ただし一回の呼び出しでは一回分のマッチ結果しか返さない*1ので、全件を取得したい場合は繰り返し呼び出す必要があります。  
*1: 要はgオプションのない正規表現を [`String.prototype.match()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/match) に渡した時と同じ配列が返ってくる
```

    var re=/(\d+)|(.+?)/g;
    var str = "a123b456";
    var result;
    while ((result = re.exec(str)) !== null) {
     console.log(JSON.stringify(result));
    }
```

で、これを使ってRubyの `String#scan` を再現すると、例えば次のようになります。

```

    String.prototype.scan = function(re) {
      var m, r = [];
      while ((m = re.exec(this)) !== null) {
        r.push(m.slice(1)); // sliceで[0]を取り除く
      }
      return r;
    };
    console.log(JSON.stringify("a123b456".scan(/(\d+)|(.+?)/g)));
```

参考 [JavaScript equivalent of Ruby's String#scan - Stack
Overflow](https://stackoverflow.com/questions/13895373)
CC BY-SA 3.0
2016-12-29T03:40:04.390
31514
2016-12-29T04:07:53.457
2017-05-23T12:38:56.467
-1
8000
31512
answer