正規表現の「グループ化」のこと、その2

正規表現の「グループ化」のこと - ten-youの日記にてFaceless様より頂いたコメントを参考に、スクリプトを以下のように書き換えました。

function event::onChannelText(prefix, channel, text)
{
    
    //ベタ出力
    send(channel, prefix.nick + ':' + text );

    if (text.match(/!\d+R\d+/ig)){

        //該当文字列を配列matchedTextに格納
        var matchedText = text.match(/!(\d+)R(\d+)/ig);
        
        //配列の中身を出力
        for (var i = 0; i < matchedText.length; i++){
            send(channel, '[' + i + '] = ' + matchedText[i] );
        }

    }
}

その実行結果↓

20:54 (ten-you) !2r6!8r10!6r12
20:54 (ten-you) ten-you:!2r6!8r10!6r12
20:54 (ten-you) [0] = !2r6
20:54 (ten-you) [1] = !8r10
20:54 (ten-you) [2] = !6r12

「!nRm(n、mは任意)」という文字列を1つのグループとして配列に格納してました。面白い。


というわけで、

        //該当文字列を配列matchedTextに格納
        var matchedText = text.match(/!(\d+)R(\d+)/ig);

の部分を

        //該当文字列を配列matchedTextに格納
        var matchedText = text.match(/!\d+R\d+/ig);

と書き換えました。()とっちゃいました。
これの実行結果はさっきと同じ。
つまりJavaScript正規表現では『/gを使うと部分的なグループ化は無視してしまう』みたいです。


しかし……とすると、どうしたら「!で始まってrまたはRの両隣にある数字の固まりだけ」を検索するのでしょう?
正規表現は難問パズルのようです。