日本語PDF

REGEXP_INSTR

構文

目的

REGEXP_INSTRは、INSTRファンクションの機能を拡張するものであり、正規表現パターンの文字列を検索できます。このファンクションでは、入力文字セットによって定義された文字を使用して文字列を評価します。また、return_option引数の値に基づいて、一致したサブストリングの開始位置または終了位置を示す整数を戻します。一致する値が見つからない場合は0(ゼロ)を戻します。

このファンクションは、POSIX正規表現規格およびUnicode Regular Expression Guidelinesに準拠しています。詳細は、「Oracleの正規表現のサポート」を参照してください。

  • source_charは、検索値として使用される文字式です。通常は文字列であり、データ型はCHARVARCHAR2NCHARNVARCHAR2CLOBまたはNCLOBのいずれかです。

  • patternは正規表現です。通常はテキスト・リテラルであり、データ型はCHARVARCHAR2NCHARまたはNVARCHAR2のいずれかになります。ここには、 512バイトまで入力できます。patternのデータ型がsource_charのデータ型と異なる場合、Oracleはpatternsource_charのデータ型に変換します。patternで指定できる演算子のリストは、「Oracleの正規表現のサポート」を参照してください。

  • positionは、Oracleが検索を開始する文字source_charの位置を示す正の整数です。デフォルトは1で、source_charの最初の文字から検索が開始されます。

  • occurrenceは、source_charに出現するpatternのうちのどれを検索するかを示す正の整数です。デフォルトは1で、最初に出現するpatternが検索されます。occurrenceが1より大きい場合、1番目のpatternが検出された後に続く1文字目から、2番目(以降)の出現を検索します。この動作は、最初の出現の2番目の文字から2番目の出現を検索するINSTRファンクションとは異なります。

  • return_optionには、出現した文字と関連して戻すものを指定できます。

    • 0(ゼロ)を指定すると、出現した文字の最初の文字の位置が戻されます。これはデフォルトです。

    • 1を指定すると、出現した文字の次の文字の位置が戻されます。

  • match_paramは、データ型がVARCHAR2またはCHARの文字式であり、ファンクションのデフォルトの照合動作を変更できます。このパラメータの動作は、REGEXP_COUNTのこのファンクションの動作と同じです。詳細は、「REGEXP_COUNT」を参照してください。

  • 部分正規表現のあるpatternの場合、subexprは、ファンクションのターゲットとなるpattern内の部分正規表現を示す0から9までの整数になります。subexprは、カッコで囲まれたpatternのフラグメントです。部分正規表現はネストできます。部分正規表現は、その左側のカッコがpatternに出現する順に番号付けされます。たとえば、次の正規表現を考えます。

    0123(((abc)(de)f)ghi)45(678)
    

    この正規表現には、abcdefghi、abcdef、abc、de、678の順に5つの部分正規表現があります。

    subexprが0(ゼロ)の場合、patternに一致するサブストリング全体の位置が戻されます。subexprが0(ゼロ)より大きい場合、一致したサブストリング内の部分正規表現番号subexprに対応するサブストリング・フラグメントの位置が戻されます。patternsubexprの部分正規表現が1つもない場合、このファンクションは0(ゼロ)を戻します。NULLのsubexpr値は、NULLを戻します。subexprのデフォルト値は0(ゼロ)です。

関連項目:

次の例では、文字列を調べて、空白以外の文字を検索します。Oracleは、文字列の最初の文字から検索を開始し、空白以外の文字が6つ目に出現する開始位置(デフォルト)を戻します。

SELECT
  REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA',
               '[^ ]+', 1, 6) "REGEXP_INSTR"
  FROM DUAL;

REGEXP_INSTR
------------
          37

次の例では、文字列を調べて、大/小文字を区別せずにsrまたはpで始まり、任意の6つのアルファベット文字が続く単語を検索します。Oracleは、文字列の3つ目の文字から検索を開始し、大文字か小文字のsrまたはpで始まる7文字の単語が2つ目に出現した後の文字の、文字列内の位置を戻します。

SELECT
  REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA',
               '[s|r|p][[:alpha:]]{6}', 3, 2, 1, 'i') "REGEXP_INSTR"
  FROM DUAL;

REGEXP_INSTR
------------
          28

次の例では、subexpr引数を使用してpattern内の特定の部分正規表現を検索します。最初の文は、最初の部分正規表現にある最初の文字のソース文字列(123)の位置を戻します。

SELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 1) 
"REGEXP_INSTR" FROM DUAL;

REGEXP_INSTR
-------------------
1

次の文は、2番目の部分正規表現にある最初の文字のソース文字列(45678)の位置を戻します。

SELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 2) 
"REGEXP_INSTR" FROM DUAL;

REGEXP_INSTR
-------------------
4

次の文は、4番目の部分正規表現にある最初の文字のソース文字列(78)の位置を戻します。

SELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 4) 
"REGEXP_INSTR" FROM DUAL;

REGEXP_INSTR
-------------------
7

REGEXP_INSTRのパターン一致: 例

次の文は、表regexp_tempを作成し、そこに値を挿入します。

CREATE TABLE regexp_temp(empName varchar2(20), emailID varchar2(20));

INSERT INTO regexp_temp (empName, emailID) VALUES ('John Doe', 'johndoe@example.com');
INSERT INTO regexp_temp (empName, emailID) VALUES ('Jane Doe', 'janedoe');

次の例では、この文は電子メールの列を問合せ、有効な電子メール・アドレスを検索します。

SELECT emailID, REGEXP_INSTR(emailID, '\w+@\w+(\.\w+)+') "IS_A_VALID_EMAIL" FROM regexp_temp;

EMAILID 	     IS_A_VALID_EMAIL
-------------------- ----------------
johndoe@example.com		    1
example.com			    0

次の例では、この文は電子メールの列を問合せ、有効な電子メール・アドレスの数を戻します。

EMPNAME		Valid Email			FIELD_WITH_VALID_EMAIL
--------	-------------------	----------------------
John Doe	johndoe@example.com	1
Jane Doe						

Live SQL:

REGEXP_INSTRのパターン一致で、Oracle Live SQLに関連する例を参照および実行します