atsukanrockのブログ

Microsoft系技術を中心にぼちぼち更新します

Oracleの正規表現サポート

はじめに

Oracle 10gから、正規表現がサポートされている。本エントリでは、その基礎的な内容を記述する。

インストール

Oracle 10gをインストールすれば、特に追加オプションのインストールなどは行わなくても、正規表現がサポートされている。

使い方

正規表現用の関数をコールする。以下で、各関数を説明する。
なお、引数名の先頭が「*」の引数は省略可能。省略可能な引数の指定を省略した場合のデフォルト値は、()で囲んで示す。

1. REGEXP_LIKE(<文字列式>, <パターン文字列>, <パターンマッチング修飾子>)
  • 指定された文字列式が、パターンにマッチする場合にTRUEを返す
  • 詳細は、『REGEXP_LIKE
  • 以下、サンプル
SELECT 'マッチ' FROM DUAL WHERE REGEXP_LIKE('hogefuga', 'gef')

→'マッチ'が検索される

SELECT 'マッチ' FROM DUAL WHERE REGEXP_LIKE('hogefuga', 'geF')

→何も検索されない

SELECT 'マッチ' FROM DUAL WHERE REGEXP_LIKE('hogefuga', 'geF', 'i')

→'マッチ'が検索される

2. REGEXP_REPLACE(<文字列式>, <パターン文字列>, <置換文字列>, <*検索開始位置(1:先頭文字)>, <*マッチング回数(0:無限)>, <*パターンマッチング修飾子>)
  • 指定された文字列式の、パターンにマッチする部分を、指定された文字列に置換した文字列を返す
  • 詳細は、『REGEXP_REPLACE
  • 以下、サンプル
SELECT REGEXP_REPLACE('HOGEFUGEFUGA', 'geF', 'gah', 1, 0, 'i') FROM DUAL

→'HOgahUgahUGA'が検索される

SELECT REGEXP_REPLACE('HOGEFUGEFUGA', 'geF', 'gah', 1, 1, 'i') FROM DUAL

→'HOgahUGEFUGA'が検索される

SELECT REGEXP_REPLACE('HOGEFUGEFUGA', 'geF', 'gah', 4, 0, 'i') FROM DUAL

→'HOGEFUgahUGA'が検索される

3. REGEXP_INSTR(<文字列式>, <パターン>, <*検索開始位置(1:先頭文字)>, <*取り出すまでの検知回数(1)>, <*検出文字位置のオフセット(0)>, <*パターンマッチング修飾子>)
  • 指定された文字列式の、パターンにマッチする部分の開始位置(何文字目か)を返す
  • 詳細は、『REGEXP_INSTR
  • 私には、引数「検出文字位置のオフセット」の使い方がよくわからない
  • 以下、サンプル
SELECT REGEXP_INSTR('HOGEFUGEFUGA', 'geF', 1, 1, 0, 'i') FROM DUAL

→3が検索される

SELECT REGEXP_INSTR('HOGEFUGEFUGA', 'geF', 1, 2, 0, 'i') FROM DUAL

→7が検索される

SELECT REGEXP_INSTR('HOGEFUGEFUGA', 'geF', 1, 3, 0, 'i') FROM DUAL

→0が検索される

4. REGEXP_SUBSTR(<文字列式>, <パターン>, <*検索開始位置(1:先頭文字)>, <*取り出すまでの検知回数(1)>, <*パターンマッチング修飾子>)
  • 指定された文字列式の、パターンにマッチする部分の文字列を返す
  • 詳細は、『REGEXP_SUBSTR
  • 以下、サンプル
SELECT REGEXP_SUBSTR('hogefuGeFUGA', 'geF', 1, 1, 'i') FROM DUAL

→'gef'が検索される

SELECT REGEXP_SUBSTR('hogefuGeFUGA', 'geF', 1, 2, 'i') FROM DUAL

→'GeF'が検索される

パターンマッチング修飾子

一般的な正規表現エンジンが備える修飾子が使える。

  • i:大/小文字区別なし
  • c:大/小文字区別あり
  • n:'.'(ピリオド)を改行にマッチさせない
  • m:複数行モード
  • x:パターン内の空白文字無視