ヘッダーをスキップ
Oracle Databaseアドバンスト・アプリケーション開発者ガイド
11gリリース1(11.1)
E05687-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

4 データベース・アプリケーションでの正規表現の使用

この章では、データベース・アプリケーションにおける正規表現の使用方法について説明します。

内容は次のとおりです。


関連項目:

  • Oracle Database SQL関数における正規表現の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • 多言語環境でのSQL正規表現関数の使用方法の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

  • O'Reilly & Associates社発行、Jonathan Gennick著、『Oracle Regular Expressions Pocket Reference』

  • O'Reilly & Associates社発行、Jeffrey E. F. Friedl著、『Mastering Regular Expressions』


正規表現の概要

内容は次のとおりです。

正規表現の概要

正規表現により、標準化された構文表記規則を使用して文字列データ内でパターンを検索できます。正規表現を指定するには、次のタイプの文字を使用します。

  • メタキャラクタ: 検索アルゴリズムを指定する演算子

  • リテラル: 検索する文字

正規表現では、複雑なパターンの文字列を指定できます。たとえば、次の正規表現では、リテラルfまたはhttリテラル、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では、正規表現のサポートが、文字列データの検索と操作を可能にするOracle Database SQL関数および条件のセットとともに実装されています。これらの関数は、Oracle Database SQLをサポートしているすべての環境で使用できます。これらの関数は、テキスト・リテラル、バインド変数またはCHARNCHARCLOBNCLOBNVARCHAR2およびVARCHAR2などの(LONGを除く)文字データを保持する任意の列で使用できます。

表4-1では、正規表現関数および条件を説明しています。

表4-1 SQL正規表現関数および条件

SQL要素 カテゴリ 説明
REGEXP_LIKE
Condition

ある文字列において特定パターンが検索されます。問合せのWHERE句でこの関数を使用すると、正規表現と一致する行が戻されます。条件は、制約内、またはブール値を戻すPL/SQLファンクションとしても有効です。

次のWHERE句では、StevenまたはStephenという名を持つ従業員がフィルタリングされます。

WHERE REGEXP_LIKE(first_name, '^Ste(v|ph)en$')
REGEXP_REPLACE
Function

文字列内の特定パターンが検索され、そのパターンの各出現箇所が指定した文字列と置き換えられます。

次の関数コールでは、country_name列の各文字の後に空白が1つ挿入されます。

REGEXP_REPLACE(country_name, '(.)', '\1 ')
REGEXP_INSTR
Function

正規表現パターン(サブストリング)の指定の出現箇所で文字列またはサブストリングが検索され、一致した文字列またはサブストリングの検出位置を示す整数が戻されます。検索する出現箇所および検索開始位置を指定します。

次の関数コールでは、email列で有効な電子メール・アドレスのブール・テストが実行されます。

REGEXP_INSTR(email, '\w+@\w+(\.\w+)+') > 0
REGEXP_SUBSTR
Function

正規表現パターン(サブストリング)の指定の出現箇所で文字列またはサブストリングが検索され、サブストリング自体が戻されます。検索する出現箇所および検索開始位置を指定します。

次の関数コールでは、正規表現内の空白が無視され、xフラグを使用して最初の文字列が一致として処理されます。

REGEXP_SUBSTR('oracle', 'o r a c l e', 1, 1, 'x')
REGEXP_COUNT
Function

文字列でのパターンの出現回数が戻されます。文字列とパターンを指定します。開始位置と一致オプション(たとえば、cの大/小文字区別)も指定できます。

次の関数コールでは、文字列'Albert Einstein'における開始文字位置7からのeEではない)の出現回数(つまり1)が戻されます。

REGEXP_COUNT('Albert Einstein', 'e', 7, 'c')

REGEXP関数または条件内の文字列リテラルは、SQLテキスト・リテラルのルールに従います。デフォルトでは、正規表現を一重引用符で囲む必要があります。正規表現に一重引用符の文字が含まれる場合は、正規表現内の1つの一重引用符を表現するために、2つの一重引用符を入力してください。こうすると、正規表現全体がSQL関数によって解析されるようになり、コードが読みやすくなります。また、q引用符構文を使用して、テキスト・リテラル用に独自の終了文字を定義することもできます。たとえば、正規表現のデリミタにシャープ記号(#)を使用し、正規表現の中で一重引用符を使用できます。


注意:

列またはバインド変数からの正規表現の引用符付けには、前述のルールは適用されません。


関連項目:

  • REGEXP関数および条件の構文、説明および例については、『Oracle Database SQL言語リファレンス』を参照してください。

  • 文字リテラルの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。


Oracle DatabaseのPOSIX正規表現標準のサポート

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へ正規表現を移植する場合は、正規表現の構文がサポートされ、予想どおりのアクションが行われることを確認してください。

正規表現のメタキャラクタ

この項の内容は次のとおりです。

Oracle Database正規表現内のPOSIXメタキャラクタ

表4-2では、SQL正規表現関数および条件に渡される正規表現での使用がサポートされているメタキャラクタを示します。これらのメタキャラクタはPOSIX標準に準拠しています。アクションが標準と異なる場合は、「説明」欄に示されています。

表4-2 Oracle Database正規表現内のPOSIXメタキャラクタ

構文 演算子名 説明

.

任意の文字: ドット

データベース・キャラクタ・セットの任意の1文字に一致します。nフラグが設定されている場合は、改行文字に一致します。改行は、Linux、UNIXおよびWindowsではラインフィード文字(\x0a)として認識され、Macintoshプラットフォームではキャリッジ・リターン文字(\x0d)として認識されます。

注意: POSIX標準では、この演算子はNULLおよび改行文字以外の任意の英字に一致します。

正規表現a.bは、文字列abbacbおよびadbに一致しますが、accには一致しません。

+


1つ以上: プラス数量子

直前の部分正規表現の1つ以上の連続に一致します。

正規表現a+は文字列aaaおよびaaaに一致しますが、bbbには一致しません。

?

ゼロまたは1つ: 疑問符数量子

直前の部分正規表現の0(ゼロ)個以上の連続に一致します。

正規表現ab?cは、文字列abcおよびacに一致しますが、abbcには一致しません。

*


ゼロ以上: 星型数量子

直前の部分正規表現のゼロ個以上の連続に一致します。デフォルトでは、数量子の一致は最長一致です。照合が続くかぎり、いくつでも一致するためです。

正規表現ab*cは、文字列acabcおよびabbcに一致しますが、abbには一致しません。

{m}

繰返し: 特定数

直前の部分正規表現のm個の連続に一致します。

正規表現a{3}は、文字列aaaに一致しますが、aaには一致しません。

{m,}

繰返し: 最小数

直前の部分正規表現のm個以上の連続に一致します。

正規表現a{3,}は、文字列aaaおよびaaaaに一致しますが、aaには一致しません。

{m,n}

繰返し: 個数範囲

直前の部分正規表現のm個以上、n個以下の連続に一致します。

正規表現a{3,5}は、文字列aaaaaaaおよびaaaaaに一致しますが、aaには一致しません。

[ ... ]

一致文字リスト

カッコで囲まれたリスト内の任意の1文字に一致します。リスト内では次の演算子を使用できますが、リストに含まれる他のメタキャラクタはリテラルとして処理されます。

  • 範囲演算子: -

  • POSIX文字クラス: [: :]

  • POSIX照合要素: [. .]

  • POSIX文字等価クラス: [= =]

ハイフン(-)は、リストの先頭または最後にある場合はリテラルで、[#--]のように範囲正規表現にある場合は範囲終了ポイントです。右カッコ(])は、リストの先頭にある場合はリテラルとして扱われます。

注意: POSIX標準では、範囲には現行ロケールの言語定義による範囲の開始から終了までの照合要素がすべて含まれます。したがって、範囲はバイト値の範囲ではなく言語によるもので、範囲正規表現のセマンティクスはキャラクタ・セットに依存しません。Oracle Databaseでは、言語範囲はNLS_SORT初期化パラメータにより決定されます。

正規表現[abc]は、文字列allbillおよびcoldの先頭文字に一致しますが、dollのどの文字とも一致しません。

[^ ... ]

非一致文字リスト

カッコで囲まれたリストにない任意の1文字に一致します。非一致文字リストに含まれない文字が一致として戻されます。文字リストに使用可能なメタキャラクタの考慮事項については、一致文字リストの演算子の説明を参照してください。

正規表現[^abc]は、文字列abcdef内の文字dに一致しますが、文字abまたはcには一致しません。正規表現[^abc]+は、文字列abcdef内の文字列defに一致しますが、文字abまたはcには一致しません。

正規表現[^a-i]では、aiの文字がすべて検索結果から除外されます。この正規表現は、文字列hij内の文字jに一致しますが、文字列abcdefghi内のどの文字にも一致しません。

|


または

選択肢の1つに一致します。

正規表現a|bは、文字aまたは文字bに一致します。

( ... )

部分正規表現またはグループ化

カッコ内の正規表現が1単位として処理されます。部分正規表現は、リテラルの文字列または演算子を含む複雑な正規表現にすることができます。

正規表現(abc)?defは、オプションの文字列abcと後続のdefに一致します。したがって、この正規表現はabcdefghiおよびdefに一致しますが、ghiには一致しません。

\n

後方参照

直前のn番目の部分正規表現、つまり、カッコ内にグループ化されている値に一致します。nは、1〜9の整数です。カッコを使用すると、正規表現が記憶されて後方参照で参照されます。後方参照では、直前の各部分正規表現の開きカッコから右に向かって部分正規表現がカウントされます。ソース文字列の\nの前に含まれている部分正規表現がn個より少ない場合、正規表現は無効です。

Oracle Databaseは、正規表現パターン内の後方参照正規表現とREGEXP_REPLACE関数の置換文字列をサポートしています。

正規表現(abc|def)xy\1は、文字列abcxyabcおよびdefxydefに一致しますが、abcxydefまたはabcxyには一致しません。

後方参照では、事前に実際の文字列がわからなくても、繰返し文字列を検索できます。たとえば、正規表現^(.*)\1$は、同じ文字列の2つの連続するインスタンスからなる1行に一致します。

\


エスケープ文字

正規表現内の後続のメタキャラクタがリテラルとして処理されます。円記号(\)を使用すると、通常はメタキャラクタとして処理される1文字を検索できます。二重円記号(\\)を使用すると、円記号リテラル自体に一致します。

正規表現\+では、プラス記号(+)が検索されます。この場合、文字列abc+def内のプラス記号は一致しますが、abcdefは一致しません。

^

行頭アンカー

文字列の先頭に一致します(デフォルト)。複数行モードでは、ソース文字列の任意の行の先頭に一致します。

正規表現^defは、文字列defghi内のdefに一致しますが、abcdef内のdefには一致しません。

$


行末アンカー

文字列の終わりに一致します(デフォルト)。複数行モードでは、ソース文字列の任意の行の先頭に一致します。

正規表現def$は、文字列abcdef内のdefに一致しますが、文字列defghi内のdefには一致しません。

[:class:]

POSIX文字クラス

指定したPOSIX文字classに属するすべての文字に一致します。この演算子を使用して大文字などの特定の書式を持つ文字を検索したり、数字または記号文字などの特殊文字を検索できます。POSIX文字クラス一式がサポートされています。

注意: 英語による正規表現の場合、範囲正規表現は通常は文字クラスを示します。たとえば、[a-z]は任意の小文字を示します。この表記規則は多言語環境では無効であり、指定した文字クラスの最初の文字と最後の文字がすべての言語で同一であるとはかぎりません。Oracle Databaseは、グローバリゼーション分類データの文字クラス定義に基づいて表4-3の文字クラスをサポートしています。

正規表現[[:upper:]]+では、1つ以上の連続する大文字が検索されます。この正規表現では、文字列abcDEFghi内のDEFに一致しますが、文字列abcdefghiには一致しません。

[.element.]

POSIX照合要素演算子

正規表現で使用する照合要素を指定します。elementは、現在のロケールで定義された照合要素である必要があります。シングルキャラクタ要素とマルチキャラクタ要素を含め、ロケールに定義されている任意の照合要素を使用します。サポートされる照合要素は、NLS_SORT初期化パラメータにより決定されます。この演算子を使用すると、他の方法では1文字しか許可されない場合にマルチキャラクタ照合要素を使用できます。たとえば、スペイン語(トラディショナル・ソート)などのロケールで定義されている照合要素chが、文字の順序に依存する操作で1文字として処理されるようにすることができます。

正規表現[[.ch.]]では照合要素chが検索され、文字列chabc内のchに一致しますが、cdefgには一致しません。正規表現[a-[.ch.]]では、範囲achが指定されます。

[=character=]

POSIX文字等価クラス

現行のロケールで指定されたcharacterと同じ文字等価クラスのメンバーであるすべての文字に一致します。

文字等価クラスは文字リスト内に含まれる必要があるため、文字等価クラスは常に正規表現内の文字リスト用の大カッコ内にネストされています。

文字等価の使用方法は、データベース・ロケールに対する標準ルールの定義によって異なります。言語ソートおよび文字列検索の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

正規表現[[=n=]]では、スペイン語ロケールでnと等価の文字が検索されます。文字列El Niño内のNおよびñの両方に一致します。



関連項目:

REGEXP関数および条件の構文、説明および例については、『Oracle Database SQL言語リファレンス』を参照してください。

POSIX正規表現標準に対する多言語拡張機能

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-3 POSIXと多言語演算子の関係

演算子 POSIX BRE構文 POSIX ERE構文 多言語拡張機能

\


あり

あり

--

*


あり

あり

--

+


--

あり

--

?

--

あり

--

|


--

あり

--

^

あり

あり

あり

$


あり

あり

あり

.

あり

あり

あり

[ ]

あり

あり

あり

( )

あり

あり

--

{m}

あり

あり

--

{m,}

あり

あり

--

{m,n}

あり

あり

--

\n

あり

あり

あり

[..]

あり

あり

あり

[::]

あり

あり

あり

[==]


あり

あり

あり


POSIX正規表現標準に対するPERLの影響を受ける拡張機能

表4-4に、Oracle Database正規表現関数および条件でサポートされ、PERLの影響を受けるメタキャラクタを示します。この種のメタキャラクタはPOSIX標準にはありませんが、PERLが普及しているため一部では一般的になっています。PERLの文字クラス・マッチングはオペレーティング・システムのロケール・モデルに基づいていますが、Oracle Databaseの正規表現はデータベースの言語固有のデータに基づいています。通常、ロケール・データが関係する正規表現の場合、PERLとOracle Databaseで同じ結果が生成されることは期待できません。

表4-4 Oracle Database正規表現でPERLの影響を受ける拡張機能

正規表現 一致

\d

数字1文字。POSIXクラス[[:digit:]]と等価です。

正規表現^\(\d{3}\) \d{3}-\d{4}$は、(650) 555-0100に一致しますが650-555-0100には一致しません。

\D

数字以外の1文字。POSIXクラス[^[:digit:]]と等価です。

正規表現\w\d\Dは、b2bおよびb2_に一致しますが、b22には一致しません。

\w

英数字またはアンダースコア(_)文字として定義されている1文字。POSIXクラス[[:alnum:]_]と等価です。アンダースコア文字を含めない場合は、POSIXクラス[[:alnum:]]を使用できます。

正規表現\w+@\w+(\.\w+)+は、文字列jdoe@company.co.ukに一致しますが、文字列jdoe@companyには一致しません。

\W

英数字およびアンダースコア以外の1文字。POSIXクラス[^[:alnum:]_]と等価です。

正規表現\w+\W\s\w+は、文字列to: billに一致しますが、文字列to billには一致しません。

\s

空白文字1文字。POSIXクラス[[:space:]]と等価です。

正規表現\(\w\s\w\s\)は、文字列(a b )に一致しますが、文字列(ab)には一致しません。

\S

空白以外の1文字。POSIXクラス[^[:space:]]と等価です。

正規表現\(\w\S\w\S\)は、文字列 (abde)に一致しますが、文字列(a b d e)には一致しません。

\A

文字列の先頭のみ。複数行モードの場合(つまり、文字列に埋め込まれた改行文字が行の終了とみなされる場合)、\Aは各行の先頭に一致しません。

正規表現\ALは、検索が単一行モードであるか複数行モードであるかに関係なく、文字列Line1\nLine2\n内の最初のL文字にのみ一致します。

\Z

文字列の終わりまたは文字列を終了する改行の前のみ。複数行モードの場合(つまり、文字列に埋め込まれた改行文字が行の終了とみなされる場合)、\Zは各行の終わりに一致しません。

正規表現\s\Zでは、検索が単一行モードであるか複数行モードであるかに関係なく、\sは文字列L i n e \n内の最後の空白に一致します。

\z

文字列の終わりのみ。

正規表現\s\zでは、検索が単一行モードであるか複数行モードであるかに関係なく、\sは文字列L i n e \n内の改行に一致します。

*?

直前のパターン要素の0回以上の出現箇所(最短一致)。この数量子は可能なかぎり空の文字列に一致します。

正規表現\w*?x\wは最短一致であるため、文字列abxcxd内のabxcに一致します。正規表現\w*x\wは最長一致であるため、文字列abxcxd内のabxcxdに一致します。正規表現\w*?x\wも、文字列xaに一致します。

+?

直前のパターン要素の1回以上の出現箇所(最短一致)。

正規表現\w+?x\wは最短一致であるため、文字列abxcxd内のabxcに一致します。正規表現\w+x\wは最長一致であるため、文字列abxcxd内のabxcxdに一致します。正規表現\w+?x\wは、文字列xaには一致しませんが、文字列axaに一致します。

??

直前のパターン要素の0回または1回の出現箇所(最短一致)。この数量子は可能なかぎり空の文字列に一致します。

正規表現a??aaは最短一致であるため、文字列aaaa内のaaに一致します。正規表現a?aaは最長一致であるため、文字列aaaa内のaaaに一致します。

{n}?

直前のパターン要素のn回の出現箇所(最短一致)。この場合、{n}?{n}と等価です。

正規表現(a|aa){2}?は、文字列aaaa内のaaに一致します。

{n,}?

直前のパターン要素のn回以上の出現箇所(最短一致)。

正規表現a{2,}?は、最短一致であり、文字列aaaaa内のaaに一致します。正規表現a{2,}は最長一致であるため、aaaaaに一致します。

{n,m}?

n回以上m回以下の出現箇所(最短一致)。{0,m}?は、可能なかぎり空の文字列に一致します。

正規表現a{2,4}?は、最短一致であり、文字列aaaaa内のaaに一致します。正規表現a{2,4}は最長一致であるため、aaaaに一致します。


Oracle Databaseの正規表現関数および条件は、表4-5に示すパターン・マッチング修飾子をサポートしています。

表4-5 パターン・マッチング修飾子

修飾子 説明

i

大/小文字区別なしの一致を指定します。

次の正規表現ではAbCdが戻されます。

REGEXP_SUBSTR('AbCd', 'abcd', 1, 1, 'i')

c

大/小文字区別ありの一致を指定します。

次の正規表現は一致に失敗します。

REGEXP_SUBSTR('AbCd', 'abcd', 1, 1, 'c')

n

デフォルトでは改行と一致しないピリオド(.)を使用して改行文字を照合できます。

次の正規表現は、nフラグが指定されているために文字列に一致します。

REGEXP_SUBSTR('a'||CHR(10)||'d', 'a.d', 1, 1, 'n')

m

検索が複数行モードで実行されます。メタキャラクタ^および$は、それぞれソース文字列全体の開始または終了のみでなく、ソース文字列の任意の場所にある任意の行の開始と終了を示します。

次の正規表現ではacが戻されます。

REGEXP_SUBSTR('ab'||CHR(10)||'ac', '^a.', 1, 2, 'm')

x

正規表現内の空白文字が無視されます。デフォルトでは、空白文字はそれ自体に一致します。

次の正規表現ではabcdが戻されます。

REGEXP_SUBSTR('abcd', 'a b c d', 1, 1, 'x')

SQL文での正規表現の使用: 例

この項の内容は次のとおりです。

制約を使用した電話番号書式の規定

正規表現は、制約を規定する際に役立つ方法です。たとえば、データベースに標準書式で電話番号を入力する必要があるとします。例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の正規表現要素の説明

正規表現要素 一致

^

文字列の先頭。

\(

左カッコ。円記号(\)は、直後の左カッコがグループ化表現ではなくリテラルであることを示すエスケープ文字です。

\d{3}

数字3文字。

\)

右カッコ。円記号(\)は、直後の右カッコがグループ化表現ではなくリテラルであることを示すエスケープ文字です。

(空白文字)

空白文字。

\d{3}

数字3文字。

-

ハイフン。

\d{4}

数字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の正規表現要素の説明

正規表現要素 説明

^

文字列の先頭に一致します。

$


文字列の終わりに一致します。

(\S+)

空白以外の1文字以上に一致します。カッコはエスケープされていないため、グループ化表現として機能します。

\s

空白文字1文字に一致します。

\1

最初の部分正規表現、つまり、一致パターンに含まれるカッコの第1グループを置き換えます。

\2

第2の部分正規表現、つまり、一致パターンに含まれるカッコの第2グループを置き換えます。

\3

第3の部分正規表現、つまり、一致パターンに含まれるカッコの第3グループを置き換えます。

,

カンマを挿入します。