ヘッダーをスキップ
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス
10g リリース2(10.2)
B19245-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

146 OWA_PATTERN

OWA_PATTERNパッケージは、文字列からテキスト・パターンを検索し、一致した文字列を他の文字列と置換するためのインタフェースを提供します。


関連項目:

このパッケージの実装の詳細は、次のマニュアルを参照してください。
  • 『Oracle HTTP Server管理者ガイド』

  • 『Oracle Application Server mod_plsqlユーザーズ・ガイド』


この章では、次の項目について説明します。


OWA_PATTERNの使用方法


タイプ

パターンは、入力および出力パラメータの両方に使用できます。 このように、同じ正規表現をOWA_PATTERNファンクション・コールに渡せるので、解析するのは一度で済みます。


使用上の注意

OWA_PATTERNサブプログラムがオーバーロードされています。 具体的には、6つのバージョンのMATCHと、AMATCHおよびCHANGEが4つずつあります。 サブプログラムでは次のパラメータを使用します。

このパッケージのサブプログラムでは正規表現を使用します。 正規表現を指定する場合は、一致させる文字列を、各種ワイルドカード・トークンおよび修飾子も含めて作成します。

ワイルドカード

ワイルドカード・トークンは、それ以外の文字に一致します。

表146-1 OWA_PATTERNパッケージで認識されるワイルドカード・トークン

トークン 説明

^

改行またはターゲットの先頭に一致します。

$


改行またはターゲットの末尾に一致します。

\n

改行に一致します。

.

改行以外のすべての文字に一致します。

\t

タブに一致します。

\d

数字(0から9)に一致します。

\D

数字以外(0から9以外)に一致します。

\w

言語文字(0から9、aからz、AからZ、または_)に一致します。

\W

非言語文字(0から9、aからz、AからZ、または_以外)に一致します。

\s

空白文字(ブランク、タブまたは改行)に一致します。

\S

非空白文字(ブランク、タブまたは改行以外)に一致します。

\b

単語の境界(\wから\Wの間)に一致します。

\x<HEX>

2つの16進数から構成される現在のキャラクタ・セットの値に一致します。

\<OCT>

2つまたは3つの8進数から構成される現在のキャラクタ・セットの値に一致します。

\


別のケースで使用されない任意の文字が続き、この文字に一致します。

&


CHANGEに対してのみ適用されます。 これを使用すると、該当する正規表現に一致した文字列は、それを置換する文字列に組み込まれます。 これは他のトークンと異なり、ターゲットに一致させる方法を指定するのではなく、ターゲットを変更する方法を指定します。 この詳細は、「CHANGEファンクションおよびプロシージャ」で説明しています。


修飾子

&以外のすべてのトークンは、次の修飾子のいずれかを使用して意味を拡張させることができます。 これらの修飾子は、リテラルに適用することもできます。

表146-2 修飾子

修飾子 説明

?

0または1回の出現。

*


0回以上の出現。

+


1回以上の出現。

{n}

正確にn回の出現。

(n,}

少なくともn回の出現。

{n,m}

n回以上、m回以下の出現。


フラグ

OWA_PATTERNファンクションおよびプロシージャは、ターゲットおよび正規表現の他に、フラグを使用して解釈の方法に影響を与えます。

表146-3 フラグ

フラグ 説明

i

大文字小文字を区別しない検索を示します。

g

CHANGEのみに適用されます。 全体に対する置換を示します。 すなわち、ターゲット内で正規表現と一致するすべての部分が置換されます。



OWA_PATTERNサブプログラムの要約

表146-4 OWA_PATTERNパッケージのサブプログラム

サブプログラム 説明

AMATCHファンクション

文字列に指定のパターンが含まれるかどうかを判定します。 文字列のどの部分と一致させるのかを指定する必要があります。

CHANGEファンクションおよびプロシージャ


文字列内のパターンを置換します。 ファンクションとしてコールした場合は、正規表現が検出されて置換された回数が戻されます。

GETPATプロシージャ


VARCHAR2型からパターン・データ型を生成します。

MATCHファンクション


文字列に指定のパターンが含まれるかどうかを判定します。



AMATCHファンクション

このファンクションは、パターンが文字列内の特定の位置に出現するかどうかを指定します。 このファンクションには4つのバージョンがあります。

構文

OWA_PATTERN.AMATCH(
   line           IN       VARCHAR2,
   from_loc       IN       INTEGER,
   pat            IN       VARCHAR2,
   flags          IN       VARCHAR2   DEFAULT NULL)
 RETURN INTEGER;

OWA_PATTERN.AMATCH(
   line           IN       VARCHAR2,
   from_loc       IN       INTEGER,
   pat            IN OUT   PATTERN,
   flags          IN       VARCHAR2   DEFAULT NULL)
 RETURN INTEGER;

OWA_PATTERN.AMATCH(
   line           IN       VARCHAR2
   from_loc       IN       INTEGER
   pat            in       varchar2
   backrefs       OUT      owa_text.vc_arr
   flags          IN       VARCHAR2   DEFAULT NULL)
 RETURN INTEGER;

OWA_PATTERN.AMATCH(
   line           IN       VARCHAR2
   from_loc       IN       INTEGER
   pat            IN OUT   PATTERN
   backrefs       OUT      owa_text.vc_arr
   flags          IN       VARCHAR2   DEFAULT NULL)
 RETURN INTEGER;

パラメータ

表146-5 AMATCHファンクションのパラメータ

パラメータ 説明

line

検索するテキスト。

from_loc

検索を開始するline内の位置(文字数)。

pat

一致させる文字列。 正規表現を使用できます。 VARCHAR2またはパターンを指定できます。 パターンを指定した場合、このパラメータの出力値は一致したパターンです。

backrefs

一致したテキスト。 一致した各トークンは、OWA_TEXT.VC_ARRデータ型のPL/SQL表のセルに配置されます。

flags

検索で大文字と小文字を区別するかどうかを指定します。 このパラメータの値が"i"の場合、検索で大文字と小文字を区別しません。 これを指定していない場合は、検索で大文字と小文字を区別します。


戻り値

一致したものの末尾に続く文字のインデックス。lineの先頭から計算されます。 一致するものがなかった場合、ファンクションは0を戻します。


CHANGEファンクションおよびプロシージャ

このファンクションまたはプロシージャは、文字列またはmulti_lineデータ型を検索して置換します。 複数のオーバーラップした文字列が正規表現に一致する場合、このサブプログラムは最長の一致を採用します。

構文

OWA_PATTERN.CHANGE(
   line           IN OUT    VARCHAR2,
   from_str       IN        VARCHAR2,
   to_str         IN        VARCHAR2,
   flags          IN        VARCHAR2   DEFAULT NULL)
 RETURN INTEGER;

OWA_PATTERN.CHANGE(
   line           IN OUT   VARCHAR2,
   from_str       IN       VARCHAR2,
   to_str         IN       VARCHAR2,
   flags          IN       VARCHAR2   DEFAULT NULL);

owa_pattern.change(
   mline          IN OUT   owa_text.multi_line,
   from_str       IN       VARCHAR2,
   to_str         IN       VARCHAR2,
   flags          IN       VARCHAR2   DEFAULT NULL)
 RETURN INTEGER;

OWA_PATTERN.CHANGE(
   mline          IN OUT   owa_text.multi_line,
   from_str       IN       VARCHAR2,
   to_str         IN       VARCHAR2,
   flags          IN       VARCHAR2   DEFAULT NULL);

パラメータ

表146-6 CHANGEプロシージャのパラメータ

パラメータ 説明

line

検索するテキスト。このパラメータの出力値は、変更された文字列です。

mline

検索するテキスト。 これはowa_text.multi_lineデータ型です。 このパラメータの出力値は、変更された文字列です。

from_str

置換する正規表現。

to_str

置換えパターン。

flags

検索で大文字と小文字を区別するか、さらに変更を全体に対して実行するかどうかを指定します。 "i"が指定されている場合、検索は大文字と小文字を区別しません。 "g"が指定されている場合、変更は一致したものすべてに対して行われます。 これを指定していない場合、ファンクションは最初の置換を実行した後で停止します。


戻り値

ファンクションとして使用した場合は、置換を実行した回数を戻します。 フラグ"g"が使用されていない場合、この数は0または1のみで、最初に一致したもののみが置換されます。 フラグ"g"が指定されると、正規表現と一致したものをすべて置換します。

OWA_PATTERN.CHANGE('Cats in pajamas', 'C.+in', '& red ')

この正規表現は、サブストリング"Cats in"に一致します。 次に、この文字列を"& red"で置換します。 アンパサンド文字"&"は、正規表現に一致するため、"Cats in"を示します。 このように、このプロシージャは文字列"Cats in pajamas"を"Cats in red"で置換します。これをプロシージャではなくファンクションとしてコールした場合、戻り値は1となります。これは置換が1回実行されたことを示します。

例2:

CREATE OR REPLACE PROCEDURE test_pattern as theline VARCHAR2(256);
num_found     INTEGER;
   BEGIN
       theline := 'what is the goal?';
       num_found := OWA_PATTERN.CHANGE(theline, 'goal', 'idea', 'g');
       HTP.PRINT(num_found); -- num_found is 1
       HTP.PRINT(theline); -- theline is 'what is the idea?'
   END;
/
SHOW ERRORS

GETPATプロシージャ

このプロシージャは、VARCHAR2文字列をOWA_PATTERN.PATTERNデータ型に変換します。

構文

OWA_PATTERN.GETPAT(
   arg      IN          VARCHAR2,
   pat      IN OUT      pattern);

パラメータ

表146-7 GETPATプロシージャのパラメータ

パラメータ 説明

arg

変換する文字列。

pat

argで初期化されたOWA_PATTERN.PATTERNデータ型。



MATCHファンクション

このファンクションは、文字列に指定のパターンが含まれるかどうかを判定します。 このパターンには正規表現を含めることができます。 複数のオーバーラップした文字列が正規表現に一致する可能性がある場合、このファンクションは最長の一致を採用します。

構文

owa_pattern.match(
   line           IN       VARCHAR2,
   pat            IN       VARCHAR2,
   flags          IN       VARCHAR2   DEFAULT NULL)
 RETURN BOOLEAN;

owa_pattern.match(
   line           IN       VARCHAR2,
   pat            IN OUT   PATTERN,
   flags          IN       VARCHAR2   DEFAULT NULL)
 RETURN BOOLEAN;

owa_pattern.match(
   line           IN       VARCHAR2,
   pat            IN       VARCHAR2,
   backrefs       OUT      owa_text.vc_arr,
   flags          IN       VARCHAR2   DEFAULT NULL)
 RETURN BOOLEAN;

OWA_PATTERN.MATCH(
   line           IN       VARCHAR2,
   pat            IN OUT   PATTERN,
   backrefs       OUT      owa_text.vc_arr,
   flags          IN       VARCHAR2   DEFAULT NULL)
 RETURN BOOLEAN;

owa_pattern.match(
   mline          IN       owa_text.multi_line,
   pat            IN       VARCHAR2,
   rlist          OUT      owa_text.row_list,
   flags          IN       VARCHAR2   DEFAULT NULL)
 RETURN BOOLEAN;

OWA_PATTERN.MATCH(
   mline          IN       owa_text.multi_line,
   pat            IN OUT   pattern,
   rlist          OUT      owa_text.row_list,
   flags          IN       VARCHAR2   DEFAULT NULL)
 RETURN BOOLEAN;

パラメータ

表146-8 MATCHファンクションのパラメータ

パラメータ 説明

line

検索する行。

mline

検索するテキスト。 これはowa_text.multi_lineデータ型です。

pat

一致させるパターン。 これは、VARCHAR2またはOWA_PATTERN.PATTERNデータ型のいずれかです。 パターンを指定した場合、このパラメータの出力値は一致したパターンです。

backrefs

一致したテキスト。 一致した各トークンは、OWA_TEXT.VC_ARRデータ型のPL/SQL表のセルに配置されます。 このパラメータはrow_listで、ターゲット内で正規表現の一連のトークンが一致した各文字列を含みます。

rlist

一致のリストを含む出力パラメータ。

flags

検索で大文字と小文字を区別するかどうかを指定します。 このパラメータの値が"i"の場合、検索で大文字と小文字を区別しません。 これを指定していない場合は、検索で大文字と小文字を区別します。


戻り値

一致するものが検出された場合はTRUE、検出されない場合はFALSEです。

KAZOOは、zoo.*という正規表現を検索するターゲットです。 ピリオドは改行以外のすべての文字を表し、アスタリスクは0個以上の先行の文字に一致します。 この場合、改行以外のすべての文字に一致します。

そのため、この正規表現は、一致ターゲットがzooおよび後続の任意の文字列から構成され、改行で終わったり改行を含んだりしない(ピリオドと一致しないため)ものであることを示します。 iフラグは、検索時に大文字小文字の区別を無視することを示します。 この場合、このファンクションはTRUEを戻し、一致するものが検出されたことを示します。

boolean foundMatch;
foundMatch := owa_pattern.match('KAZOO', 'zoo.*', 'i');

次の例では、sometext内で"goal"の後にいくつかの文字が続く文字列を検索します。 検出された場合は、次のようになります。

sometext  VARCHAR2(256);
pat       VARCHAR2(256);

sometext    := 'what is the goal?'
pat         := 'goal.*';
IF OWA_PATTERN.MATCH(sometext, pat)
   THEN
      HTP.PRINT('Match found');
   ELSE
     HTP.PRINT('Match not found');
END IF;

使用上の注意