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正規表現」の項を参照
パターンマッチ →●[マニュアル]





┏━━━━━━━━━━┓
┃ 本ページは以上です ┃
┗━━━━━━━━━━┛

本ページは今後必要になった時点で追記予定。


                                                                                                            
以上 
inserted by FC2 system