この章では、データベース・アプリケーションにおける正規表現の使用方法について説明します。
内容は次のとおりです。
関連項目:
|
内容は次のとおりです。
正規表現により、標準化された構文表記規則を使用して文字列データ内でパターンを検索できます。正規表現を指定するには、次のタイプの文字を使用します。
メタキャラクタ: 検索アルゴリズムを指定する演算子
リテラル: 検索する文字
正規表現では、複雑なパターンの文字列を指定できます。たとえば、次の正規表現では、リテラルf
またはht
、t
リテラル、p
リテラルおよびオプションでそれに続くs
リテラル、最後にコロン(:
)リテラルが検索されます。
(f|ht)tps?:
カッコは、一連のパターン要素を1つの要素にグループ化するメタキャラクタで、パイプ記号(|
)はグループ内の代替項目の1つを一致させます。疑問符(?
)は、直前のパターン(この場合はs
文字)がオプションであることを示すメタキャラクタです。したがって、前述の正規表現はhttp:
、https:
、ftp:
およびftps:
文字列に一致します。
正規表現は、PERLやJavaのようなプログラミング言語の強力なテキスト処理コンポーネントです。たとえば、PERLスクリプトでは、ディレクトリ内の各HTMLファイルを処理し、その内容を1つの文字列としてスカラー変数に読み取り、正規表現を使用して文字列内のURLを検索できます。多くの開発者がPERLを使用する理由の1つは、その堅牢なパターン・マッチング機能にあります。
Oracle Databaseは正規表現をサポートしているため、開発者はデータベースに複雑な一致ロジックを実装できます。この手法は、次のような理由で有用です。
一致ロジックをOracle Database内に集中化させることで、中間層アプリケーションがSQL結果セットの文字列処理に集中するのを回避できます。たとえば、ライフサイエンス分野のユーザーは、通常、DNAとタンパク質の大規模データベースに格納されている生命情報データのパターン分析にPERLを使用しています。従来、[AG]
.{4}GK[ST]
のようなタンパク質配列の一致検索は中間層で処理されていました。SQL正規表現機能は、処理ロジックをデータに近づけることで、より有効なソリューションを提供します。
Oracle Database 10gまでは、開発者は一般にクライアント上でデータ検証ロジックをコーディングしていたため、同じ検証ロジックを複数のクライアントに複製する必要がありました。サーバー側の正規表現を使用して制約を規定すると、この問題を解決できます。
組込みSQLおよびPL/SQL正規表現関数および条件により、従来のリリースのOracle Databaseに比べて文字列操作が強力になり、煩雑さが軽減されています。
Oracle Databaseでは、正規表現のサポートが、文字列データの検索と操作を可能にするOracle Database SQL関数および条件のセットとともに実装されています。これらの関数は、Oracle Database SQLをサポートしているすべての環境で使用できます。これらの関数は、テキスト・リテラル、バインド変数またはCHAR
、NCHAR
、CLOB
、NCLOB
、NVARCHAR2
およびVARCHAR2
などの(LONG
を除く)文字データを保持する任意の列で使用できます。
表4-1では、正規表現関数および条件を説明しています。
表4-1 SQL正規表現関数および条件
REGEXP
関数または条件内の文字列リテラルは、SQLテキスト・リテラルのルールに従います。デフォルトでは、正規表現を一重引用符で囲む必要があります。正規表現に一重引用符の文字が含まれる場合は、正規表現内の1つの一重引用符を表現するために、2つの一重引用符を入力してください。こうすると、正規表現全体がSQL関数によって解析されるようになり、コードが読みやすくなります。また、q引用符構文を使用して、テキスト・リテラル用に独自の終了文字を定義することもできます。たとえば、正規表現のデリミタにシャープ記号(#
)を使用し、正規表現の中で一重引用符を使用できます。
注意: 列またはバインド変数からの正規表現の引用符付けには、前述のルールは適用されません。 |
関連項目:
|
Oracle Databaseの正規表現の実装は、次の標準に準拠しています。
IEEEのPortable Operating System Interface(POSIX)標準ドラフト1003.2/D11.2
Unicode ConsortiumのUnicode正規表現ガイドライン
Oracle Databaseは、ASCII(英語)データの照合に関してPOSIX標準に定義されている演算子の構文と一致セマンティクスに正確に準拠しています。POSIX標準のドラフトについては、次のURLを参照してください。
http://www.opengroup.org/onlinepubs/007908799/xbd/re.html
Oracle Databaseでは、正規表現サポートが次のように拡張されています。
多言語データの照合機能がPOSIX標準で指定されている以上に拡張されています。
POSIX標準には含まれていないが競合もしない一般的なPERL正規表現拡張機能のサポートが追加されています。Oracle Databaseは、文字クラスのショートカットや最短一致修飾子など、最も使用頻度の高い一部のPERL正規表現演算子に対する組込みサポートを提供します。
Oracle Databaseは、正規表現で使用される一連の共通メタキャラクタをサポートします。サポートされるメタキャラクタおよび関連機能のアクションは、「正規表現のメタキャラクタ」で説明します。
注意: メタキャラクタの解析は、正規表現をサポートするツールによって異なります。別の環境からOracle Databaseへ正規表現を移植する場合は、正規表現の構文がサポートされ、予想どおりのアクションが行われることを確認してください。 |
表4-2では、SQL正規表現関数および条件に渡される正規表現での使用がサポートされているメタキャラクタを示します。これらのメタキャラクタはPOSIX標準に準拠しています。アクションが標準と異なる場合は、「説明」欄に示されています。
表4-2 Oracle Database正規表現内のPOSIXメタキャラクタ
構文 | 演算子名 | 説明 | 例 |
---|---|---|---|
|
任意の文字: ドット |
データベース・キャラクタ・セットの任意の1文字に一致します。 注意: POSIX標準では、この演算子はNULLおよび改行文字以外の任意の英字に一致します。 |
正規表現 |
|
1つ以上: プラス数量子 |
直前の部分正規表現の1つ以上の連続に一致します。 |
正規表現 |
|
ゼロまたは1つ: 疑問符数量子 |
直前の部分正規表現の0(ゼロ)個以上の連続に一致します。 |
正規表現 |
|
ゼロ以上: 星型数量子 |
直前の部分正規表現のゼロ個以上の連続に一致します。デフォルトでは、数量子の一致は最長一致です。照合が続くかぎり、いくつでも一致するためです。 |
正規表現 |
|
繰返し: 特定数 |
直前の部分正規表現の |
正規表現 |
|
繰返し: 最小数 |
直前の部分正規表現の |
正規表現 |
|
繰返し: 個数範囲 |
直前の部分正規表現の |
正規表現 |
|
一致文字リスト |
カッコで囲まれたリスト内の任意の1文字に一致します。リスト内では次の演算子を使用できますが、リストに含まれる他のメタキャラクタはリテラルとして処理されます。
ハイフン( 注意: POSIX標準では、範囲には現行ロケールの言語定義による範囲の開始から終了までの照合要素がすべて含まれます。したがって、範囲はバイト値の範囲ではなく言語によるもので、範囲正規表現のセマンティクスはキャラクタ・セットに依存しません。Oracle Databaseでは、言語範囲は |
正規表現 |
|
非一致文字リスト |
カッコで囲まれたリストにない任意の1文字に一致します。非一致文字リストに含まれない文字が一致として戻されます。文字リストに使用可能なメタキャラクタの考慮事項については、一致文字リストの演算子の説明を参照してください。 |
正規表現 正規表現 |
|
または |
選択肢の1つに一致します。 |
正規表現 |
|
部分正規表現またはグループ化 |
カッコ内の正規表現が1単位として処理されます。部分正規表現は、リテラルの文字列または演算子を含む複雑な正規表現にすることができます。 |
正規表現 |
|
後方参照 |
直前のn番目の部分正規表現、つまり、カッコ内にグループ化されている値に一致します。 Oracle Databaseは、正規表現パターン内の後方参照正規表現と |
正規表現 後方参照では、事前に実際の文字列がわからなくても、繰返し文字列を検索できます。たとえば、正規表現 |
|
エスケープ文字 |
正規表現内の後続のメタキャラクタがリテラルとして処理されます。円記号(\)を使用すると、通常はメタキャラクタとして処理される1文字を検索できます。二重円記号( |
正規表現 |
|
行頭アンカー |
文字列の先頭に一致します(デフォルト)。複数行モードでは、ソース文字列の任意の行の先頭に一致します。 |
正規表現 |
|
行末アンカー |
文字列の終わりに一致します(デフォルト)。複数行モードでは、ソース文字列の任意の行の先頭に一致します。 |
正規表現 |
|
POSIX文字クラス |
指定したPOSIX文字 注意: 英語による正規表現の場合、範囲正規表現は通常は文字クラスを示します。たとえば、 |
正規表現 |
|
POSIX照合要素演算子 |
正規表現で使用する照合要素を指定します。 |
正規表現 |
|
POSIX文字等価クラス |
現行のロケールで指定された 文字等価クラスは文字リスト内に含まれる必要があるため、文字等価クラスは常に正規表現内の文字リスト用の大カッコ内にネストされています。 文字等価の使用方法は、データベース・ロケールに対する標準ルールの定義によって異なります。言語ソートおよび文字列検索の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。 |
正規表現 |
関連項目: REGEXP 関数および条件の構文、説明および例については、『Oracle Database SQL言語リファレンス』を参照してください。 |
Oracle DatabaseのPOSIX演算子実装を多言語データに適用すると、POSIX標準に指定されている照合機能の範囲を超えて拡張されます。表4-3に、POSIX標準のコンテキストにおける演算子の関係を示します。
第1列はサポートされている演算子を示します。
第2列は、基本正規表現(BRE)に関するPOSIX標準で演算子が定義されているかどうかを示します。
第3列は、拡張正規表現(ERE)に関するPOSIX標準で演算子が定義されているかどうかを示します。
第4列は、Oracle Database実装により演算子のセマンティクスが多言語データの処理用に拡張されるかどうかを示します。
Oracle Databaseでは、直接入力方法でマルチバイト・キャラクタを直接入力するか、関数を使用してマルチバイト・キャラクタを構成できます。\
xxxx
形式のUnicode 16進エンコーディング値は使用できません。Oracle Databaseでは、文字はグラフィカル表現ではなくエンコーディングに使用されるバイト値に基づいて評価されます。
表4-4に、Oracle Database正規表現関数および条件でサポートされ、PERLの影響を受けるメタキャラクタを示します。この種のメタキャラクタはPOSIX標準にはありませんが、PERLが普及しているため一部では一般的になっています。PERLの文字クラス・マッチングはオペレーティング・システムのロケール・モデルに基づいていますが、Oracle Databaseの正規表現はデータベースの言語固有のデータに基づいています。通常、ロケール・データが関係する正規表現の場合、PERLとOracle Databaseで同じ結果が生成されることは期待できません。
表4-4 Oracle Database正規表現でPERLの影響を受ける拡張機能
正規表現 | 一致 | 例 |
---|---|---|
|
数字1文字。POSIXクラス |
正規表現 |
|
数字以外の1文字。POSIXクラス |
正規表現 |
|
英数字またはアンダースコア( |
正規表現 |
|
英数字およびアンダースコア以外の1文字。POSIXクラス |
正規表現 |
|
空白文字1文字。POSIXクラス |
正規表現 |
|
空白以外の1文字。POSIXクラス |
正規表現 |
|
文字列の先頭のみ。複数行モードの場合(つまり、文字列に埋め込まれた改行文字が行の終了とみなされる場合)、 |
正規表現 |
|
文字列の終わりまたは文字列を終了する改行の前のみ。複数行モードの場合(つまり、文字列に埋め込まれた改行文字が行の終了とみなされる場合)、 |
正規表現 |
|
文字列の終わりのみ。 |
正規表現 |
|
直前のパターン要素の0回以上の出現箇所(最短一致)。この数量子は可能なかぎり空の文字列に一致します。 |
正規表現 |
|
直前のパターン要素の1回以上の出現箇所(最短一致)。 |
正規表現 |
|
直前のパターン要素の0回または1回の出現箇所(最短一致)。この数量子は可能なかぎり空の文字列に一致します。 |
正規表現 |
|
直前のパターン要素の |
正規表現 |
|
直前のパターン要素の |
正規表現 |
|
|
正規表現 |
Oracle Databaseの正規表現関数および条件は、表4-5に示すパターン・マッチング修飾子をサポートしています。
表4-5 パターン・マッチング修飾子
修飾子 | 説明 | 例 |
---|---|---|
|
大/小文字区別なしの一致を指定します。 |
次の正規表現では REGEXP_SUBSTR('AbCd', 'abcd', 1, 1, 'i') |
|
大/小文字区別ありの一致を指定します。 |
次の正規表現は一致に失敗します。 REGEXP_SUBSTR('AbCd', 'abcd', 1, 1, 'c') |
n |
デフォルトでは改行と一致しないピリオド(.)を使用して改行文字を照合できます。 |
次の正規表現は、 REGEXP_SUBSTR('a'||CHR(10)||'d', 'a.d', 1, 1, 'n') |
m |
検索が複数行モードで実行されます。メタキャラクタ |
次の正規表現では REGEXP_SUBSTR('ab'||CHR(10)||'ac', '^a.', 1, 2, 'm') |
|
正規表現内の空白文字が無視されます。デフォルトでは、空白文字はそれ自体に一致します。 |
次の正規表現では REGEXP_SUBSTR('abcd', 'a b c d', 1, 1, 'x') |
正規表現は、制約を規定する際に役立つ方法です。たとえば、データベースに標準書式で電話番号を入力する必要があるとします。例4-1では、contacts
表を作成し、p_number
列にCHECK
制約を追加して次の書式マスクを規定しています。
(XXX) XXX-XXXX
例4-1 正規表現を使用した電話番号書式の規定
SQL> CREATE TABLE contacts 2 (l_name VARCHAR2(30), 3 p_number VARCHAR2(30) 4 CONSTRAINT c_contacts_pnf 5 CHECK (REGEXP_LIKE (p_number, '^\(\d{3}\) \d{3}-\d{4}$')) 6 ); Table created. SQL>
表4-6に、この正規表現の要素を示します。
表4-6 例4-1の正規表現要素の説明
正規表現要素 | 一致 |
---|---|
|
文字列の先頭。 |
|
左カッコ。円記号( |
|
数字3文字。 |
|
右カッコ。円記号( |
(空白文字) |
空白文字。 |
|
数字3文字。 |
|
ハイフン。 |
|
数字4文字。 |
|
文字列の終わり。 |
例4-2のSQL*Plusスクリプトは、7つの電話番号をcontacts
表に挿入しようとします。c_contacts_pnf
制約に準拠する書式を使用しているINSERT
文は最初の2つのみで、残りの文ではCHECK
制約エラーが生成されます。
例4-2 正しい書式と誤った書式での電話番号の挿入
SQL> INSERT INTO contacts (p_number) VALUES('(650) 555-0100'); 1 row created. SQL> INSERT INTO contacts (p_number) VALUES('(215) 555-0100'); 1 row created. SQL> INSERT INTO contacts (p_number) VALUES('650 555-0100'); INSERT INTO contacts (p_number) VALUES('650 555-0100') * ERROR at line 1: ORA-02290: check constraint (HR.C_CONTACTS_PNF) violated SQL> INSERT INTO contacts (p_number) VALUES('650 555 0100'); INSERT INTO contacts (p_number) VALUES('650 555 0100') * ERROR at line 1: ORA-02290: check constraint (HR.C_CONTACTS_PNF) violated SQL> INSERT INTO contacts (p_number) VALUES('650-555-0100'); INSERT INTO contacts (p_number) VALUES('650-555-0100') * ERROR at line 1: ORA-02290: check constraint (HR.C_CONTACTS_PNF) violated SQL> INSERT INTO contacts (p_number) VALUES('(650)555-0100'); INSERT INTO contacts (p_number) VALUES('(650)555-0100') * ERROR at line 1: ORA-02290: check constraint (HR.C_CONTACTS_PNF) violated SQL> INSERT INTO contacts (p_number) VALUES(' (650) 555-0100'); INSERT INTO contacts (p_number) VALUES(' (650) 555-0100') * ERROR at line 1: ORA-02290: check constraint (HR.C_CONTACTS_PNF) violated
表4-2に示したように、後方参照では一致した部分正規表現が一時バッファに格納されるため、文字を再配置できます。バッファにアクセスするには\n
表記法を使用します。n
は1〜9の番号です。部分正規表現はそれぞれカッコで囲まれ、左から右へ順番に番号が付いています。
例4-3のSQL*Plusスクリプトは、表を作成して、様々な書式の氏名を移入します。また、氏名を書式「ファースト・ネーム、ミドル・ネーム、ラスト・ネーム」から書式「ラスト・ネーム、ファースト・ネーム、ミドル・ネーム」に再配置する問合せを使用します。書式が「ファースト・ネーム ミドル・ネーム ラスト・ネーム」でない氏名は無視されます。この問合せの正規表現の要素は表4-7で説明します。
例4-3 後方参照を使用した文字の再配置
SQL> -- Create and populate table SQL> SQL> CREATE TABLE famous_people (names VARCHAR2(20)); Table created. SQL> SQL> INSERT INTO famous_people VALUES ('John Quincy Adams'); 1 row created. SQL> INSERT INTO famous_people VALUES ('Harry S. Truman'); 1 row created. SQL> INSERT INTO famous_people VALUES ('John Adams'); 1 row created. SQL> INSERT INTO famous_people VALUES (' John Quincy Adams'); 1 row created. SQL> INSERT INTO famous_people VALUES ('John_Quincy_Adams'); 1 row created. SQL> SQL> -- Repositioning query: SQL> SQL> COLUMN "names after regexp" FORMAT A20 SQL> SQL> SELECT names "names", 2 REGEXP_REPLACE(names, '^(\S+)\s(\S+)\s(\S+)$', '\3, \1 \2') 3 AS "names after regexp" 4 FROM famous_people; names names after regexp -------------------- -------------------- John Quincy Adams Adams, John Quincy Harry S. Truman Truman, Harry S. John Adams John Adams John Quincy Adams John Quincy Adams John_Quincy_Adams John_Quincy_Adams 5 rows selected.
表4-7 例4-3の正規表現要素の説明
正規表現要素 | 説明 |
---|---|
|
文字列の先頭に一致します。 |
|
文字列の終わりに一致します。 |
|
空白以外の1文字以上に一致します。カッコはエスケープされていないため、グループ化表現として機能します。 |
|
空白文字1文字に一致します。 |
|
最初の部分正規表現、つまり、一致パターンに含まれるカッコの第1グループを置き換えます。 |
|
第2の部分正規表現、つまり、一致パターンに含まれるカッコの第2グループを置き換えます。 |
|
第3の部分正規表現、つまり、一致パターンに含まれるカッコの第3グループを置き換えます。 |
|
カンマを挿入します。 |