正規表現のおさらいシリーズ
その1:https://www.venture-net.co.jp/engineer/18433/
その2:https://www.venture-net.co.jp/engineer/18437/
その3:https://www.venture-net.co.jp/engineer/18441/
その5:https://www.venture-net.co.jp/engineer/18459/

今回は第4弾です。

後方参照

正規表現は複雑な文字列パターンを探す場合に有用ですが、文字列パターンを置換する場合にも非常に強力に機能します。

丸括弧でくくったものはグループ化されるということは以前におさらいした通りです。このグループ化された部分は、後から参照することができます。

後からというのはいつなのかということになりますが、これは正規表現を実際に利用する環境・プログラミング言語・ソフトウェアによりますが、置換後の指定をするところになります。

例えば JavaScript では、/ (スラッシュ)で囲んだものは正規表現オブジェクトになります。
/[abc]/ とすれば、a か b か c の1文字、ということになります。
そして、文字列の置換を行う場合は文字列オブジェクトの replace メソッドを使用します。

‘abcdef’.replace(‘a’, ‘b’); とすれば、文字列 abcdef について、a を b に置換する、ということになり、この置換前の文字列には、正規表現を指定することができます。

‘abcdef’.replace(/a/, ‘b’); とすることもできるというわけです。

つまりこの replace メソッドの2番目の引数が置換後の指定をするところであり、上記ではそれに ‘b’ を指定したということになります。

本題です。

ある9桁の数字を、3桁ごとに区切ってハイフンを入れたいとします。例えばこうです。

123456789 → 123-456-789

このような置換を行う場合、まず正規表現はどうなるでしょうか。数字が9桁なので、/[0-9]{9}/ と書くことができます。
しかしここでは3桁ごとにグループ化したいので、

/([0-9]{3})([0-9]{3})([0-9]{3})/ のように書いてみます。これも、「0から9までのどれかが3つきて、その後に0から9までのどれかが3つきて、その後に0から9までのどれかが3つくる」という正規表現なので、9桁の数字にマッチします。

この丸括弧で囲ったグループ化した部分は、置換後の指定で使うことができます。この機能を **後方参照** と呼びます。
JavaScript では、後方参照は $ と数字であらわします。例えば $1 や $2 のようになります。$1 は1つ目のグループ、$2 は2つ目のグループということになります。

まとめると、9桁の数字を3桁ごとに区切ってハイフンを入れるには、以下のようになります。

正規表現:/([0-9]{3})([0-9]{3})([0-9]{3})/
置換後の文字列:$1-$2-$3

JavaScript で書くことこうなります。

var s  = '123456789'.replace(/([0-9]{3})([0-9]{3})([0-9]{3})/, '$1-$2-$3');