PostgreSQLの正規表現で複数の繰り返し文字列を他の文字列に置換する方法 - regexp_replace関数を使用
PostgreSQLの正規表現で複数の繰り返し文字列を置換するには、regexp_replaceを使用すると便利である。
《サンプル》
テーブル「test_table」のカラム(列)「test_colmn1」に以下のような文字列が格納されている場合を想定。
<「test_colmn1」に格納されている内容(置換前)>
ぷよぷよで遊ぶと楽しい。
特に、アルルで7連鎖を達成した時の掛け声が爽快感があってよい。
ばよえーーーーーーん
ばよえええええん
この中の文字列「ばよえーーーーーーん」や「ばよえええええん」を「ばよえーん」に統一したい場合、繰り返し文字列の「ー」と「え」を何とかして一文字の「ー」に置換できないか、を考える。
1.繰り返し文字列を含む行数をカウントする。
SELECT count(test_colmn1) FROM test_table WHERE test_colmn1 ~ E'ばよえ(ー|え)+ん';
※パターン文字列にマッチする行数をカウントする。行数が0の場合、正規表現で置換する必要がない。
※「(ー|え)+」と書いているところが、繰り返し部分で、「+」(プラス記号)は、1回以上繰り返されていることを意味する。
※「(ー|え)」については、「ー」または「え」ということになるので、「(ー|え)+」という正規表現の意味としては、「ー」または「え」が1回以上繰り返されている、という意味になる。
2.繰り返し文字列を他の文字列に置換する。
update test_table set test_colmn1 = regexp_replace(test_colmn1, E'ばよえ(ー|え)+ん', E'ばよえーん','g') where test_colmn1 ~ E'ばよえ(ー|え)+ん';
※regexp_replace関数で正規表現にマッチしたパターン文字列を置換する。
※「g」オプションを付けておかないと、マッチした1つの文字列しか置換しない。マッチした全ての文字列を対象として置換する場合には、「g」オプションを付ける必要がある。
<「test_colmn1」に格納されている内容(置換後)>
ぷよぷよで遊ぶと楽しい。
特に、アルルで7連鎖を達成した時の掛け声が爽快感があってよい。
ばよえーん
ばよえーん
応用として、「氏 名」や「氏 名」のような文字列を「氏名」などのように、特定文字列内の全角・半角のスペースを削除するような時にも使える。