正規表現の「グループ化」のこと、その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の両隣にある数字の固まりだけ」を検索するのでしょう?
正規表現は難問パズルのようです。