PostgreSQLスキルアップノート(自己啓発のための個人サイト)
パターンマッチ・その2(POSIX正規表現)
【一覧に戻る】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■■■ PostgreSQL スキルアップノート
■■■■
■◆■■ パターンマッチ・その2(POSIX正規表現)
■■■■
■■■■
■■■■ 2013/01/04
■■■■ 使用環境:PostgreSQL9.1.4 (CentOS6.2)
(C) 2012 ohdb
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
★自己都合によりマニュアルへのリンクは9.2としています。ご了承下さい。
★このページはそのままカット&ペーストで実行して試すことができます。
【マニュアル】
パターンマッチ →●[マニュアル]
【参考記事】
−
【用語等】
PostgreSQLのパターンマッチは大別して3種類。(マニュアルより)
・LIKE演算子
・SIMILAR TO演算子
・POSIX正規表現
本ページでは「POSIX正規表現」を対象。
■1■ 概要
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SIMILAR TO演算子よりも強力。
egrep、sed、awkなどで扱いなれた記述を利用することができる。
■2■ 簡単な例
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
正規表現の詳細はマニュアル参照(SIMILAR TOの正規表現とは異なる)
テストデータ
drop table if exists t1 cascade;
create table t1 (c1 serial,c2 text);
insert into t1 values
(default,'abcde'),
(default,'ABCDE'),
(default,'ae'),
(default,'EFG123'),
(default,'EFG123A'),
(default,'SQLscript'),
(default,'SQLSQLscript'),
(default,'SQLSQLSQLscript'),
(default,'SQLLLscript')
;
select * from t1;
c1 | c2
----+-----------------
1 | abcde
2 | ABCDE
3 | ae
4 | EFG123
5 | EFG123A
6 | SQLscript
7 | SQLSQLscript
8 | SQLSQLSQLscript
9 | SQLLLscript
【□】 "cd"が含まれるもの
SELECT * FROM t1 WHERE c2 ~ 'cd';
c1 | c2
----+-------
1 | abcde
【□】 大文字小文字問わず"cd"が含まれるもの
SELECT * FROM t1 WHERE c2 ~* 'cd';
c1 | c2
----+-------
1 | abcde
2 | ABCDE
【□】 大文字小文字問わず"cd"が含まれないもの
SELECT * FROM t1 WHERE c2 !~* 'cd';
【□】 先頭が大文字のアルファベットのもの
SELECT * FROM t1 WHERE c2 ~ '^[A-Z]';
3 | ae
4 | EFG123
5 | EFG123A
6 | SQLscript
7 | SQLSQLscript
8 | SQLSQLSQLscript
9 | SQLLLscript
【□】 aで始まりeで終わるもの
SELECT * FROM t1 WHERE c2 ~ '^a.*e$';
c1 | c2
----+-------
1 | abcde
3 | ae
【□】 半角の英数字だけからなるもの
SELECT * FROM t1 WHERE c2 ~ '^[0-9a-zA-Z]*$';
c1 | c2
----+-----------------
1 | abcde
2 | ABCDE
3 | ae
4 | EFG123
6 | SQLscript
7 | SQLSQLscript
8 | SQLSQLSQLscript
9 | SQLLLscript
※ 5 | EFG123A は表示されない。
【□】 文字列ABCまたは123が含まれるもの
SELECT * FROM t1 WHERE c2 ~ 'ABC|123';
c1 | c2
----+----------
2 | ABCDE
4 | EFG123
5 | EFG123A
【□】 SQLという繰り返しが1回以上含まれるもの
SELECT * FROM t1 WHERE c2 ~ '(SQL)+';
c1 | c2
----+-----------------
6 | SQLscript
7 | SQLSQLscript
8 | SQLSQLSQLscript
9 | SQLLLscript
※ +ではなく*を使用すると0個も含まれるので意図した結果にはならない。
【□】 先頭SQLで始まりその3回繰り返しが含まれるもの
SELECT * FROM t1 WHERE c2 ~ '^(SQL){3}';
c1 | c2
----+-----------------
8 | SQLSQLSQLscript
※ この例の場合SQLが仮に4個繰り返されたものがあっても3回の繰り返しという条件に合致するので
(SQL){3,} (3回以上)と同じ意味になる。 (あくまでこの例の場合)
【□】 先頭SQLで始まりその「L」の3回繰り返しが含まれるもの
SELECT * FROM t1 WHERE c2 ~ '^SQL{3}';
c1 | c2
----+-------------
9 | SQLLLscript
※ この例の場合Lが仮に4個繰り返されたものがあっても3回の繰り返しという条件に合致するので
L{3,} (3回以上)と同じ意味になる。 (あくまでこの例の場合)
■2■ 正規表現を使用できる関数
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
・substring関数 部分文字列を取り出し
・regexp_replace関数 部分文字列を置換
・regexp_matches関数 捕捉された全ての部分文字列のテキスト配列を返す。
・regexp_split_to_table関数 正規表現パターンを区切り文字として使用し、文字列を分割
・regexp_split_to_array関数 結果をtext配列で返す以外は、regexp_split_to_tableと同じ
詳細は以下の「POSIX正規表現」の項を参照
パターンマッチ →●[マニュアル]
┏━━━━━━━━━━┓
┃ 本ページは以上です ┃
┗━━━━━━━━━━┛
本ページは今後必要になった時点で追記予定。
以上