JavaScriptにおける正規表現内のキャプチャグループ
キャプチャグループの内容は、置換文字列だけでなく、正規表現自体の中でも利用できます: 何かをキャプチャグループに格納し、その正規表現内で「ここにはこのキャプチャグループの内容が入るべきだ」と指定することができます。
キャプチャグループの内容は、その番号にバックスラッシュを付けたもので参照できます。例えば、
最初のキャプチャグループは \1 で、
2番目のキャプチャグループは \2、
3番目は \3 というようになります。
ここまでの説明がまだよくわからなくても不思議ではありません。 キャプチャグループは正規表現の中で最も理解しにくい部分の一つだからです。例を通して理解を深めていきましょう。
例
次のような文字列があるとします:
let str = 'aa bb cd ef';
この中から、同じ文字が2回連続して現れる部分をすべて見つけてみましょう。 解決策としては、任意の文字を探し、それをキャプチャグループに格納し、 その次の文字がこのキャプチャグループの内容と一致するかどうかを確認します:
let res = str.replace(/([a-z])\1/g, '!');
結果、変数には次のような文字列が格納されます:
'! ! cd ef'
例
次のような文字列があるとします:
let str = 'asxca buzxb csgd';
この中から、最初と最後の文字が同じである単語をすべて見つけてみましょう。 解決策として、次のパターンを記述します: 1文字目をキャプチャし、 その後に1文字以上の任意の文字が続き、最後に最初にキャプチャした文字と同じ文字が来る:
let res = str.replace(/([a-z])[a-z]+\1/g, '!');
結果、変数には次のような文字列が格納されます:
'! ! csgd'
練習問題
次の文字列が与えられます:
let str = 'aaa bbb ccc xyz';
同じ文字が3回連続して現れるすべての部分文字列を見つけてください。
次の文字列が与えられます:
let str = 'a aa aaa aaaa aaaaa';
同じ文字が2回以上連続して現れるすべての部分文字列を見つけてください。
次の文字列が与えられます:
let str = 'aaa aaa bbb bbb ccc ddd';
同じ単語が2回連続して現れるすべての部分文字列を見つけてください。