REGEXP_INSTR
構文
目的
REGEXP_INSTR
は、INSTR
ファンクションの機能を拡張するものであり、正規表現パターンの文字列を検索できます。このファンクションでは、入力文字セットによって定義された文字を使用して文字列を評価します。また、return_option
引数の値に基づいて、一致したサブストリングの開始位置または終了位置を示す整数を戻します。一致する値が見つからない場合は0(ゼロ)を戻します。
このファンクションは、POSIX正規表現規格およびUnicode Regular Expression Guidelinesに準拠しています。詳細は、「Oracleの正規表現のサポート」を参照してください。
-
source_char
は、検索値として使用される文字式です。通常は文字列であり、データ型はCHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
のいずれかです。 -
pattern
は正規表現です。通常はテキスト・リテラルであり、データ型はCHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
のいずれかになります。ここには、 512バイトまで入力できます。pattern
のデータ型がsource_char
のデータ型と異なる場合、Oracleはpattern
をsource_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
に対応するサブストリング・フラグメントの位置が戻されます。pattern
にsubexpr
の部分正規表現が1つもない場合、このファンクションは0(ゼロ)を戻します。NULLのsubexpr
値は、NULL
を戻します。subexpr
のデフォルト値は0(ゼロ)です。
関連項目:
-
「INSTR」および「REGEXP_SUBSTR」を参照してください。
-
「REGEXP_REPLACE」および「REGEXP_LIKE条件」を参照してください。
-
source_char
の文字をpattern
の文字と比較するためにREGEXP_INSTR
で使用する照合を定義する照合決定ルールは、『Oracle Databaseグローバリゼーション・サポート・ガイド』の付録Cを参照してください。
例
次の例では、文字列を調べて、空白以外の文字を検索します。Oracleは、文字列の最初の文字から検索を開始し、空白以外の文字が6つ目に出現する開始位置(デフォルト)を戻します。
SELECT REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA', '[^ ]+', 1, 6) "REGEXP_INSTR" FROM DUAL; REGEXP_INSTR ------------ 37
次の例では、文字列を調べて、大/小文字を区別せずにs
、r
またはp
で始まり、任意の6つのアルファベット文字が続く単語を検索します。Oracleは、文字列の3つ目の文字から検索を開始し、大文字か小文字のs
、r
または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に関連する例を参照および実行します