| Oracle Database アプリケーション開発者ガイド-基礎編 10gリリース2(10.2) B19248-02 |
|
この章では、Oracle Databaseの正規表現のサポートについて説明します。この章の内容は次のとおりです。
この項の内容は次のとおりです。
正規表現により、標準化された構文表記規則を使用して文字列データ内でパターンを検索できます。正規表現を指定するには、次のタイプの文字を使用します。
正規表現では、複雑なパターンの文字列を指定できます。たとえば、次の正規表現では、リテラルfまたはht、tリテラル、pリテラルおよびオプションでそれに続くsリテラル、最後にコロン(:)リテラルが検索されます。
(f|ht)tps?:
カッコは、一連のパターン要素を1つの要素にグループ化するメタキャラクタで、パイプ記号(|)はグループ内の代替項目の1つを一致させます。疑問符(?)は、直前のパターン(この場合はs文字)がオプションであることを示すメタキャラクタです。したがって、前述の正規表現はhttp:、https:、ftp:およびftps:文字列に一致します。
正規表現は、PerlやJavaのようなプログラミング言語の強力なテキスト処理コンポーネントです。たとえば、Perlスクリプトでは、ディレクトリ内の各HTMLファイルを処理し、その内容を1つの文字列としてスカラー変数に読み取り、正規表現を使用して文字列内のURLを検索できます。多くの開発者がPerlを使用する理由の1つは、その堅牢なパターン・マッチング機能にあります。
Oracleは正規表現をサポートしているため、開発者はデータベースに複雑な一致ロジックを実装できます。この手法は、次のような理由で有用です。
[AG].{4}GK[ST]のようなタンパク質配列の一致検索は中間層で処理されていました。SQL正規表現機能は、処理ロジックをデータに近づけることで、より有効なソリューションを提供します。
Oracle Databaseでは、正規表現のサポートが、文字列データの検索と操作を可能にするOracle Database SQL関数および条件のセットとともに実装されています。これらの関数は、Oracle Database SQLをサポートしているすべての環境で使用できます。これらの関数は、テキスト・リテラル、バインド変数またはCHAR、NCHAR、CLOB、NCLOB、NVARCHAR2およびVARCHAR2などの(LONGを除く)文字データを保持する任意の列で使用できます。
表4-1では、正規表現関数および条件を簡単に説明しています。
REGEXP関数または条件内の文字列リテラルは、SQLテキスト・リテラルのルールに従います。デフォルトでは、正規表現を一重引用符で囲む必要があります。正規表現に一重引用符の文字が含まれる場合は、正規表現内の1つの一重引用符を表現するために、2つの一重引用符を入力してください。こうすると、正規表現全体がSQL関数によって解析されるようになり、コードが読みやすくなります。また、q引用符構文を使用して、テキスト・リテラル用に独自の終了文字を定義することもできます。たとえば、正規表現のデリミタにシャープ記号(#)を使用し、正規表現の中で一重引用符を使用できます。
Oracleの正規表現の実装は、次の標準に準拠しています。
Oracle Databaseは、ASCII(英語)データの照合に関してPOSIX標準に定義されている演算子の構文と一致セマンティクスに正確に準拠しています。POSIX標準のドラフトについては、次のURLを参照してください。
http://www.opengroup.org/onlinepubs/007908799/xbd/re.html
Oracle Databaseでは、正規表現サポートが次のように拡張されています。
Oracle Databaseは、正規表現で使用される一連の共通メタキャラクタをサポートします。サポートされるメタキャラクタおよび関連機能の動作は、「Oracle Databaseの正規表現のメタキャラクタ」で説明します。
この項の内容は次のとおりです。
表4-2では、SQL正規表現関数および条件に渡される正規表現での使用がサポートされているメタキャラクタを示します。これらのメタキャラクタはPOSIX標準に準拠しています。動作が標準と異なる場合は、「説明」欄に示されています。
| 構文 | 演算子名 | 説明 | 例 |
|---|---|---|---|
|
|
任意の文字−ドット |
データベース・キャラクタ・セットの任意の1文字に一致します。 注意: POSIX標準では、この演算子はNULLおよび改行文字以外の任意の英字に一致します。 |
正規表現 |
|
|
1つ以上− |
直前の部分正規表現の1つ以上の連続に一致します。 |
正規表現 |
|
|
ゼロまたは1つ− |
直前の部分正規表現の0(ゼロ)個以上の連続に一致します。 |
正規表現 |
|
|
ゼロ以上− |
直前の部分正規表現のゼロ個以上の連続に一致します。デフォルトでは、最大数まで一致しても残りの照合に成功できるため、数量子の一致は最長一致となります。 |
正規表現 |
|
|
繰返し−特定数 |
直前の部分正規表現の |
正規表現 |
|
|
繰返し−最小数 |
直前の部分正規表現の |
正規表現 |
|
|
繰返し−個数範囲 |
直前の部分正規表現の |
正規表現 |
|
|
一致文字リスト |
カッコで囲まれたリスト内の任意の1文字に一致します。リスト内では次の演算子を使用できますが、リストに含まれる他のメタキャラクタはリテラルとして処理されます。
ハイフン(
注意: POSIX標準では、範囲には現行ロケールの言語定義による範囲の開始から終了までの照合要素がすべて含まれます。したがって、範囲はバイト値の範囲ではなく言語によるもので、範囲正規表現のセマンティクスはキャラクタ・セットに依存しません。Oracle Databaseでは、言語範囲は |
正規表現 |
|
|
非一致文字リスト |
カッコで囲まれたリストにない任意の1文字に一致します。非一致文字リストに含まれない文字が一致として戻されます。文字リストに使用可能なメタキャラクタの考慮事項については、一致文字リストの演算子の説明を参照してください。 |
正規表現
正規表現 |
|
|
または |
選択肢の1つに一致します。 |
正規表現 |
|
|
部分正規表現またはグループ化 |
カッコ内の正規表現が1単位として処理されます。部分正規表現は、リテラルの文字列または演算子を含む複雑な正規表現にすることができます。 |
正規表現 |
|
|
後方参照 |
直前のn番目の部分正規表現、つまり、カッコ内にグループ化されている値に一致します。
Oracleは、正規表現パターン内の後方参照正規表現と |
正規表現
後方参照では、事前に実際の文字列がわからなくても、繰返し文字列を検索できます。たとえば、正規表現 |
|
|
エスケープ文字 |
正規表現内の後続のメタキャラクタがリテラルとして処理されます。円記号(¥)を使用すると、通常はメタキャラクタとして処理される1文字を検索できます。二重円記号(¥¥)を使用すると、円記号リテラル自体に一致します。 |
正規表現¥ |
|
|
行頭アンカー |
文字列の先頭に一致します(デフォルト)。複数行モードでは、ソース文字列の任意の行の先頭に一致します。 |
正規表現 |
|
|
行末アンカー |
文字列の終わりに一致します(デフォルト)。複数行モードでは、ソース文字列の任意の行の先頭に一致します。 |
正規表現 |
|
|
POSIX文字クラス |
指定したPOSIX文字
注意: 英語による正規表現の場合、範囲正規表現は通常は文字クラスを示します。たとえば、 |
正規表現 |
|
|
POSIX照合要素演算子 |
正規表現で使用する照合要素を指定します。
この演算子を使用すると、他の方法では1文字しか許可されない場合にマルチキャラクタ照合要素を使用できます。たとえば、スペイン語(トラディショナル・ソート)などのロケールで定義されている照合要素 |
正規表現 |
|
|
POSIX文字等価クラス |
現行のロケールで指定された 文字等価クラスは文字リスト内に含まれる必要があるため、文字等価クラスは常に正規表現内の文字リスト用の大カッコ内にネストされています。 文字等価の使用方法は、データベース・ロケールに対する標準ルールの定義によって異なります。言語ソートおよび文字列検索の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。 |
正規表現 |
OracleのPOSIX演算子実装を多言語データに適用すると、POSIX標準に指定されている照合機能の範囲を超えて拡張されます。表4-3に、POSIX標準のコンテキストにおける演算子の関係を示します。
Oracle Databaseでは、直接入力方法でマルチバイト・キャラクタを直接入力するか、関数を使用してマルチバイト・キャラクタを構成できます。¥xxxx形式のUnicode 16進エンコーディング値は使用できません。Oracleでは、文字はグラフィカル表現ではなくエンコーディングに使用されるバイト値に基づいて評価されます。
表4-4に、Oracle Database正規表現関数および条件でサポートされていてPerlの影響を受けるメタキャラクタを示します。この種のメタキャラクタはPOSIX標準にはありませんが、Perlが普及しているため一部では一般的になっています。Perlの文字クラス・マッチングはオペレーティング・システムのロケール・モデルに基づいていますが、Oracle Databaseの正規表現はデータベースの言語固有のデータに基づいていることに注意してください。通常、ロケール・データが関係する正規表現の場合、PerlとOracle Databaseで同じ結果が生成されることは期待できません。
Oracle Databaseの正規表現関数および条件は、表4-5に示すパターン・マッチング修飾子をサポートしています。
この項の内容は次のとおりです。
正規表現は、整合性制約を規定する際に役立つ方法です。たとえば、電話番号がデータベースに必ず標準書式で入力されるようにする必要があるとします。例4-1では、contacts表を作成し、p_number列にチェック制約を追加して次の書式マスクを規定しています。
(XXX) XXX-XXXX例 4-1 正規表現を使用した電話番号書式の規定
CREATE TABLE contacts ( l_name VARCHAR2(30), p_number VARCHAR2(30) CONSTRAINT p_number_format CHECK ( REGEXP_LIKE ( p_number, '^¥(¥d{3}¥) ¥d{3}-¥d{4}$' ) ) );
表4-6に、この正規表現の要素を示します。
例4-2に、contacts表に7つの電話番号を挿入するSQLスクリプトを示します。p_number_format制約に準拠する書式を使用しているINSERT文は最初の2つのみで、残りの文ではチェック制約エラーが生成されます。
-- first two statements use valid phone number format INSERT INTO contacts (p_number) VALUES( '(650) 555-5555' ); INSERT INTO contacts (p_number) VALUES( '(215) 555-3427' ); -- remaining statements generate check contraint errors INSERT INTO contacts (p_number) VALUES( '650 555-5555' ); INSERT INTO contacts (p_number) VALUES( '650 555 5555' ); INSERT INTO contacts (p_number) VALUES( '650-555-5555' ); INSERT INTO contacts (p_number) VALUES( '(650)555-5555' ); INSERT INTO contacts (p_number) VALUES( ' (650) 555-5555' ); /
表4-2に示したように、後方参照では、一致した部分正規表現が一時バッファに格納されるため、文字を再配置できます。バッファにアクセスするには¥n表記法を使用します。¥nは1〜9の番号です。部分正規表現はそれぞれカッコで囲まれ、左から右へと順番に番号が付いています。
例4-3では、famous_people表を作成し、famous_people.names列に様々な書式で名前を移入しています。
CREATE TABLE famous_people ( names VARCHAR2(30) ); -- populate table with data INSERT INTO famous_people VALUES ('John Quincy Adams'); INSERT INTO famous_people VALUES ('Harry S. Truman'); INSERT INTO famous_people VALUES ('John Adams'); INSERT INTO famous_people VALUES (' John Quincy Adams'); INSERT INTO famous_people VALUES ('John_Quincy_Adams'); COMMIT;
例4-4に、氏名を書式「ファースト・ネーム ミドル・ネーム ラスト・ネーム」から書式「ラストネーム、ファースト・ネーム ミドル・ネーム」に再配置する問合せを示します。書式が「ファースト・ネーム ミドル・ネーム ラスト・ネーム」でない氏名は無視されます。
SELECT names "names", REGEXP_REPLACE(names, '^(¥¥S+)¥s(¥S+)¥s(¥S+)$', '¥3, ¥1 ¥2') AS "names after regexp" FROM famous_people;
表4-7に、この正規表現の要素を示します。
例4-5に、例4-4の問合せの結果セットを示します。この正規表現は、最初の2行にのみ一致しました。
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
|
![]() Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|