正規表現
置換
元の文字列

正規表現で置換時にマッチした文字をそのまま使う

この記事は ウェブクルー Advent Calendar 2017の19日目の記事です。
昨日は@a_tamuraさんの「使ってもらえるシステムが作るためには」でした。

背景

仕事でテストデータ(100万件)を変換する時に使用したため。
数年前に正規表現について勉強したが忘れたため、調べて試した内容を記述。

試したエディタツール

  • サクラエディタ
  • Visual Studio Code

変換前のデータ

idが1から順番に振られていたデータ

INSERT INTO user(id,name,rank) values(1,'テスト太郎','上')
INSERT INTO user(id,name,rank) values(2,'テスト花子','上')
INSERT INTO user(id,name,rank) values(3,'テスト三郎','並')
INSERT INTO user(id,name,rank) values(4,'テスト五郎','特')

こんなデータにしたい

idが100万+1から順番に振られているデータにしたい

INSERT INTO user(id,name,rank) values(1000001,'テスト太郎','上')
INSERT INTO user(id,name,rank) values(1000002,'テスト花子','上')
INSERT INTO user(id,name,rank) values(1000003,'テスト三郎','並')
INSERT INTO user(id,name,rank) values(1000004,'テスト五郎','特')

やり方

検索条件:(\d)
置換文字列:1000000$1

解説

$1というものは、検索条件にて()内で使用した文字列をそのまま使う。
今回の件だと「¥d」つまり「数字一文字」である。(0~9まで)

()内について

()内は正規表現でなくとも構わない。
固定されている文字列の場合なら、固定文字列で良い。
例えば、上記の変換後のデータで、「テスト~~」を「テスト・D・~~」に変換したい場合、
検索条件:(テスト)
置換文字列:$1・D・
とすれば「テスト・D・太郎」「テスト・D・花子」・・・と変換することができる。

複数使いたい場合

「\$1」の1は一つ目という意味なので、二つ目のマッチした文字列を使いたい場合は「$2」という感じでドル以降の数字を増やしていけば良い。

早い話

正規表現で ()で囲んだ文字列は $1で使えるよ!!
()内は正規表現じゃなくても文字列でも大丈夫だよ!
だから今すぐ ()で囲んでみてね!!!

参考文献

https://www.graffe.jp/blog/1688/