正規表現のおさらい (4)

正規表現のおさらいシリーズ
その1:http://developer.venture-net.co.jp/entry/2018/06/22/174206
その2:http://developer.venture-net.co.jp/entry/2018/06/29/192116
その3:http://developer.venture-net.co.jp/entry/2018/07/06/185719

今回は第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');