31514


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

[code]

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

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

[code]

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

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

[code]

    p "a123b456".scan(/(\d+)|(.+?)/)
    # => [[nil, "a"], ["123", nil], [nil, "b"], ["456", nil]]
    
[/code]


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) に渡した時と同じ配列が返ってくる
[code]

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

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

[code]

    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)));
[/code]

参考 [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