クイック スタート
チュートリアル
ツール & 言語
リファレンス
書籍 レビュー
Regexツール
grep
PowerGREP
RegexBuddy
RegexMagic
一般的なアプリケーション
EditPad Lite
EditPad Pro
言語とライブラリ
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery & XPath
XRegExp
データベース
MySQL
Oracle
PostgreSQL
このサイトのその他の情報
はじめに
正規表現クイックスタート
正規表現チュートリアル
置換文字列チュートリアル
アプリケーションと言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
書籍レビュー
印刷可能なPDF
このサイトについて
RSSフィードとブログ
RegexBuddy—The best regex editor and tester for Oracle developers!

Oracle Databaseの正規表現

バージョン10gリリース1以降、Oracle Databaseでは、SQLおよびPL/SQLステートメントで使用できる4つのregexp関数が提供されています。これらの関数は、POSIX拡張正規表現(ERE)標準を実装しています。Oracleは、ブラケット式における照合シーケンス等価クラスを完全にサポートしています。NLS_SORT設定により、使用されるPOSIXロケールが決定され、利用可能な照合シーケンスと等価クラスが決定されます。

ただし、OracleはPOSIX ERE標準を正確に実装しているわけではありません。3つの領域で逸脱しています。まず、Oracleは正規表現で後方参照をサポートしています。\1次のように\9。POSIX ERE標準は、POSIX BREであっても、これらをサポートしていません。完全に準拠したエンジンでは、\1次のように\9は不正となります。POSIX標準では、メタキャラクタではない文字をバックスラッシュでエスケープすることは不正であると規定されています。Oracleではこれが許可されており、バックスラッシュは単に無視されます。例:\qは、qとOracleでは同じ意味になります。結果として、すべてのPOSIX ERE正規表現をOracleで使用できますが、Oracleで動作する一部の正規表現は、完全にPOSIX準拠のエンジンではエラーを引き起こす可能性があります。当然ながら、Oracleのみを使用する場合、これらの違いは無関係です。

3つ目の違いは、より微妙です。エラーは発生しませんが、異なる一致結果になる可能性があります。POSIX標準に関するトピックで説明したように、正規表現エンジンは選択肢の場合、最長の一致を返す必要があります。Oracleのエンジンはこれを行いません。このWebサイトで説明したすべての非POSIX正規表現フレーバーと同様に、従来のNFAエンジンです。

他のプログラミング言語で正規表現を使用したことがある場合、POSIXでは、\t(タブ用)や\n(改行用)のような印刷不可能な文字のエスケープはサポートされていないことに注意してください。C++などのプログラミング言語のPOSIXエンジンではこれらを使用できます。これは、C++コンパイラが文字列定数で\t\nを解釈するためです。SQLステートメントでは、正規表現でタブや改行に一致させるために、文字列に実際のタブや改行を入力する必要があります。Oracleの正規表現エンジンは、'\t'という文字列を正規表現パラメータとして渡した場合、tとして解釈します。

Oracle 10g R2では、フリースペーシングモード(コメントのサポートなし)、省略形文字クラス遅延量指定子、およびアンカー\A, \Z、および\zを追加することで、正規表現構文をさらに拡張しています。Oracle 11gと12cでは、10g R2と同じ正規表現フレーバーを使用します。

OracleのREGEXP関数

Oracle Database 10gは、4つの正規表現関数を提供します。これらはSQLおよびPL/SQLステートメントで同様に使用できます。

REGEXP_LIKE(source, regexp, modes)はおそらく最も頻繁に使用する関数でしょう。SELECTステートメントのWHERE句とHAVING句で使用できます。PL/SQLスクリプトでは、ブール値を返します。CHECK制約でも使用できます。sourceパラメータは、正規表現が照合される文字列または列です。regexpパラメータは、正規表現を含む文字列です。modesパラメータはオプションです。マッチングモードを設定します。

SELECT * FROM mytable WHERE REGEXP_LIKE(mycolumn, 'regexp', 'i');
IF REGEXP_LIKE('subject', 'regexp') THEN /* Match */ ELSE /* No match */ END IF;
ALTER TABLE mytable ADD (CONSTRAINT mycolumn_regexp CHECK (REGEXP_LIKE(mycolumn, '^regexp$')));

REGEXP_SUBSTR(source, regexp, position, occurrence, modes)は、正規表現によってsourceで一致した文字列を返します。一致が失敗した場合、NULLが返されます。REGEXP_SUBSTRは、単一の文字列または列で使用できます。SELECT句で使用して、列の特定の部分のみを取得できます。positionパラメータは、ソース文字列内の一致試行を開始する文字位置を指定します。最初の文字の位置は1です。occurrenceパラメータは、取得する一致を指定します。最初の一致を取得するには1に設定します。より高い数値を指定した場合、Oracleは、指定した数だけ一致が見つかるまで、前回の一致の終了位置から正規表現の一致を試み続けます。最後の一致が返されます。一致がそれよりも少ない場合は、NULLが返されます。このパラメータを後方参照と混同しないでください。Oracleは、キャプチャグループによって一致した文字列の一部を返す関数を提供していません。最後の3つのパラメータはオプションです。

SELECT REGEXP_SUBSTR(mycolumn, 'regexp') FROM mytable;
match := REGEXP_SUBSTR('subject', 'regexp', 1, 1, 'i')

REGEXP_REPLACE(source, regexp, replacement, position, occurrence, modes)は、1つまたはすべての正規表現の一致が置換されたソース文字列を返します。一致が見つからない場合、元の文字列が返されます。occurrence(上記の段落を参照)に正の数を指定すると、その一致のみが置換されます。ゼロを指定するか、パラメータを省略すると、すべての一致が置換されます。最後の3つのパラメータはオプションです。replacementパラメータは、各正規表現の一致を置き換える文字列です。置換テキストで後方参照を使用して、キャプチャグループによって一致したテキストを再挿入できます。同じグループを複数回参照できます。正規表現全体の一致を再挿入するための置換テキストトークンはありません。これを行うには、正規表現全体を括弧で囲み、置換で\1次のように\9を使用します。をリテラルで挿入する場合は、\1を使用します。リテラルで挿入する場合は、\1という文字列を使用します。バックスラッシュは、数字または別のバックスラッシュが続く場合にのみエスケープする必要があります。を挿入するには、'\\1'を使用します。SQLでは文字列でバックスラッシュをエスケープする必要はありませんが、REGEXP_REPLACE関数ではエスケープする必要があります。\\という文字列を使用します。バックスラッシュは、数字または別のバックスラッシュが続く場合にのみエスケープする必要があります。を挿入するには、'\\\\'を使用します。SQLでは文字列でバックスラッシュをエスケープする必要はありませんが、REGEXP_REPLACE関数ではエスケープする必要があります。

SELECT REGEXP_REPLACE(mycolumn, 'regexp', 'replacement') FROM mytable;
result := REGEXP_REPLACE('subject', 'regexp', 'replacement', 1, 0, 'i');

REGEXP_INSTR(source, regexp, position, occurrence, return_option, modes)は、ソース文字列内の正規表現一致の開始位置または終了位置を返します。この関数は、REGEXP_SUBSTRと同じパラメータに加えて、もう1つのパラメータを受け取ります。return_optionをゼロに設定するか、パラメータを省略すると、一致の最初の文字の位置が取得されます。一致後の最初の文字の位置を取得するには、1に設定します。文字列の最初の文字の位置は1です。一致が見つからない場合、REGEXP_INSTRはゼロを返します。最後の4つのパラメータはオプションです。

SELECT REGEXP_INSTR(mycolumn, 'regexp', 1, 1, 0, 'i') FROM mytable;

REGEXP_COUNT(source, regexp, position, modes)は、ソース文字列内で正規表現が一致する回数を返します。正規表現が一致をまったく見つけられない場合はゼロを返します。この関数はOracle 11g以降でのみ利用可能です。

SELECT REGEXP_COUNT(mycolumn, 'regexp', 1, 'i') FROM mytable;

Oracleのマッチングモード

4つのregexp関数のそれぞれが受け入れるmodesパラメータは、4つの可能な文字から最大3文字の文字列である必要があります。例:'i'は、大文字と小文字を区別しないマッチングをオンにし、'inm'は、これら3つのオプションをオンにします。'i''c'は相互に排他的です。このパラメータを省略するか、空の文字列を渡すと、デフォルトのマッチングモードが使用されます。

さらに詳しく

Oracle Regular Expressions Pocket ReferenceO’Reillyの書籍「Oracle Regular Expressions Pocket Reference」は、Oracle Database 10gの正規表現について知っておくべきことをすべて教えてくれる、非常に便利な64ページのボリュームです。書籍の表紙とは異なり、実際にはチュートリアルとリファレンスの両方が含まれています。Oracleの正規表現サポートはかなり限定されているため、この小さな本はOracleで正規表現を正常に使用するために必要なすべてです。

書籍「Oracle Regular Expressions Pocket Reference」の私のレビュー

| クイック スタート | チュートリアル | ツール & 言語 |  | リファレンス | 書籍 レビュー |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery & XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |