正規表現
PostgreSQL

PostgreSQLで正規表現

正規表現マッチ演算子

PostgreSQLには正規表現マッチ演算子というのがある。LIKEやILIKEでは表現しきれないパターンに使える。

演算子 説明
~ 正規表現に一致する。大文字小文字の区別あり。
~* 正規表現に一致する。大文字小文字の区別なし。
!~ 正規表現に一致しない。大文字小文字の区別あり。
!~* 正規表現に一致しない。大文字小文字の区別なし。

"~" が基本。
"~*" は "~" の大文字小文字の区別なし版。
"!~"、"!~*" はそれぞれ "~" と "~*" の否定。

例の結果
'abc' ~ '^a' true
'abc' ~* '^a' true
'abc' ~ '^A' false
'abc' ~* '^A' true
'abc' !~ '^a' false
'abc' !~* '^a' false
'abc' !~ '^A' true
'abc' !~* '^A' false

regexp_replace

正規表現を用いた文字列置換関数。

regexp_replace(string text, pattern text, replacement text [, flags text])

"\1", "\2", … "\N" でパターン内において括弧でくくった部分にマッチした部分を replacement に使うことができる。"\N" はN番目の括弧の部分。実際の replacement では "\\1" のようにバックスラッシュを重ねて書く。

主なフラグ

フラグ 説明
i 大文字小文字の区別をしない
g 最初のマッチだけでなく全てのマッチを置換

実行例

結果
REGEXP_REPLACE('abcdeabcde', 'c.', 'X') abXeabcde
REGEXP_REPLACE('abcdeabcde', 'c.', 'X', 'g') abXeabXe
REGEXP_REPLACE('ABCDEabcde', 'c.', 'X', 'g') ABCDEabXe
REGEXP_REPLACE('ABCDEabcde', 'c.', 'X', 'ig') ABXEabXe
REGEXP_REPLACE('abcdeabcde', 'b(.)d', E'Y\\1Z', 'g') aYcZeaYcZe

参考ページ

PostgreSQL 9.1.5文書 9.7.3. POSIX正規表現
PostgreSQL 9.1.5文書 4.1.2.2. C形式エスケープでの文字列定数