[Oracle] 正規表現の活用 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

Oracle10g から正規表現がサポートされるようになりました。

POSIX 正規表現規格、Unicode Regular Expression Guidelineに準拠するということですが、要は普通に正規表現を使えるということです。


正規表現を利用できる機能は以下の4つです。

【条件】
 REGEXP_LIKE

【関数】
 REGEXP_INSTR
 REGEXP_SUBSTR
 REGEXP_REPLACE


REGEXP_LIKE
LIKE 条件の正規表現版です。

書式は以下のとおりです。

REGEXP_LIKE(source_string,pattern[,match_parameter])

  source_string   : 検索する対象の文字列
  pattern         : 正規表現
  match_parameter : 一致動作を決定するパラメータ

以下のように使用します。

SQL> select ename from emp where regexp_like(ename, '(.)\1');

ENAME
--------------------
ALLEN
SCOTT
MILLER

REGEXP_INSTR
INSTR の正規表現版です。

書式は以下のとおりです。

REGEXP_INSTR(source_string,pattern[,position[,occurence[,return_option[,match_parameter]]]])

  source_string   : 検索する対象の文字列
  pattern         : 正規表現
  position        : 検索開始位置を示す整数
  occurence       : 何番目に一致するものを対象とするかを示す整数
  return_option   : 戻り値として返す文字の位置
  match_parameter : 一致動作を決定するパラメータ

以下のように使用します。

SQL> select ename, regexp_instr(ename, '(.)\1') from emp;


ENAME                REGEXP_INSTR(ENAME,'(.)\1')
-------------------- ---------------------------
SMITH                                          0
ALLEN                                          2
WARD                                           0
JONES                                          0
MARTIN                                         0
BLAKE                                          0
CLARK                                          0
SCOTT                                          4
KING                                           0
TURNER                                         0
ADAMS                                          0
JAMES                                          0
FORD                                           0
MILLER                                         3

REGEXP_SUBSTR
SUBSTR の正規表現版です。

書式は以下のとおりです。

REGEXP_SUBSTR(source_string,pattern[,position[,occurence[,match_parameter]]])

  source_string   : 検索する対象の文字列
  pattern         : 正規表現
  position        : 検索開始位置を示す整数
  occurence       : 何番目に一致するものを対象とするかを示す整数
  match_parameter : 一致動作を決定するパラメータ

以下のように使用します。

SQL> select ename, regexp_substr(ename, '(.)\1') from emp;

ENAME                REGEXP_SUBSTR(ENAME,'(.)\1')
-------------------- ------------------------------
SMITH
ALLEN                LL
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT                TT
KING
TURNER
ADAMS
JAMES
FORD
MILLER               LL

REGEXP_REPLACE
REPLACE の正規表現版です。

書式は以下のとおりです。

REGEXP_SUBSTR(source_string,pattern[,position[,occurence[,match_parameter]]])

  source_string   : 検索する対象の文字列
  pattern         : 正規表現
  replace_string  : 置換文字列(正規表現への後方参照を使用することができます。)
  position        : 検索開始位置を示す整数
  occurence       : 何番目に一致するものを対象とするかを示す整数
  match_parameter : 一致動作を決定するパラメータ

以下のように使用します。

SQL> select ename, regexp_replace(ename, '(.)\1','\1') from emp;

ENAME                REGEXP_REPLACE(ENAME,'(.)\1','\1')
-------------------- -----------------------------------
SMITH                SMITH
ALLEN                ALEN
WARD                 WARD
JONES                JONES
MARTIN               MARTIN
BLAKE                BLAKE
CLARK                CLARK
SCOTT                SCOT
KING                 KING
TURNER               TURNER
ADAMS                ADAMS
JAMES                JAMES
FORD                 FORD
MILLER               MILER

使用例が適切かどうかはさておき、以上のように正規表現を使用した検索や置換を行うことができるというわけです。

これらの条件や関数は正規表現を使えるという点以外は元となる条件や関数とほぼ同じです。

だったら、元の条件や関数で正規表現を使えるようにしてくれればいいのにと思わなくもないですが、そうすると正規表現として扱う意図がないのに正規表現として扱われてしまうことによる誤動作も起こりそうなので、こういう実装が現実的なのでしょう。

いずれにせよ、正規表現を使用できるようになったことで、SQLでできる処理の幅がぐんと広がることは確かです。

積極的に利用して損はないと思われます。