構文
用途
REGEXP_REPLACE
は、正規表現パターンで文字列を検索できるようにREPLACE
の機能を拡張したものです。デフォルトでは、このファンクションは、正規表現パターンに一致するすべての文字をreplace_string
に置き換えてsource_char
を戻します。source_char
と同じキャラクタ・セットの文字列が戻されます。このファンクションは、1つ目の引数がLOBではない場合はVARCHAR2
を戻し、1つ目の引数がLOBの場合はCLOB
を戻します。
このファンクションは、POSIX正規表現規格およびUnicode Regular Expression Guidelinesに準拠しています。詳細は、付録D「Oracleの正規表現のサポート」を参照してください。
source_char
は、検索値として使用される文字式です。一般的には文字の列であり、データ型はCHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
、NCLOB
のいずれかになります。
pattern
は正規表現です。通常はテキスト・リテラルであり、データ型はCHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
のいずれかになります。ここには、 512バイトまで入力できます。pattern
のデータ型がsource_char
のデータ型と異なる場合、Oracleはpattern
をsource_char
のデータ型に変換します。pattern
で指定できる演算子のリストは、付録D「Oracleの正規表現のサポート」を参照してください。
replace_string
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。replace_string
がCLOB
またはNCLOB
の場合、replace_string
は32KBに切り捨てられます。replace_string
には、最大500個の部分正規表現への後方参照を\n
という書式で指定できます。n
は、1から9の数値です。replace_string
にバックスラッシュ(\
)を含める場合、その前にエスケープ文字(これもバックスラッシュ)を付ける必要があります。たとえば、\2
を置き換えるには、\\2
を入力します。後方参照表現の詳細は、「Oracleの正規表現のサポート」の表D-1に示す説明を参照してください。
position
は、Oracleが検索を開始する文字source_char
の位置を示す正の整数です。デフォルトは1で、source_char
の最初の文字から検索が開始されます。
occurrence
は、置換操作の対象となる文字を示す、負ではない整数です。
0(ゼロ)を指定すると、一致したすべての文字が置換されます。
正の整数n
を指定すると、n
番目に一致した文字が置換されます。
occurrence
が1より大きい場合、1番目のpattern
が検出された後に続く1文字目から、2番目(以降)の出現を検索します。この動作は、最初の出現の2番目の文字から2番目の出現を検索するINSTR
ファンクションとは異なります。
match_parameter
は、ファンクションのデフォルトの検索動作を変更するためのテキスト・リテラルです。このパラメータの動作は、REGEXP_COUNT
のこのファンクションの動作と同じです。詳細は、「REGEXP_COUNT」を参照してください。
例
次の例では、phone_number
を調べて、xxx
.xxx
.xxxx
というパターンを検索します。その後、このパターンを(xxx
) xxx
-xxxx
という書式に変更します。
SELECT REGEXP_REPLACE(phone_number, '([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})', '(\1) \2-\3') "REGEXP_REPLACE" FROM employees ORDER BY "REGEXP_REPLACE"; REGEXP_REPLACE -------------------------------------------------------------------------------- (515) 123-4444 (515) 123-4567 (515) 123-4568 (515) 123-4569 (515) 123-5555 . . .
次の例では、country_name
を調べます。文字列内のNULLでない各文字の後に空白を挿入します。
SELECT REGEXP_REPLACE(country_name, '(.)', '\1 ') "REGEXP_REPLACE" FROM countries; REGEXP_REPLACE -------------------------------------------------------------------------------- A r g e n t i n a A u s t r a l i a B e l g i u m B r a z i l C a n a d a . . .
次の例では、文字列を調べて、2つ以上の空白を検索します。検索された2つ以上の空白を、それぞれ1つの空白に置換します。
SELECT REGEXP_REPLACE('500 Oracle Parkway, Redwood Shores, CA', '( ){2,}', ' ') "REGEXP_REPLACE" FROM DUAL; REGEXP_REPLACE -------------------------------------- 500 Oracle Parkway, Redwood Shores, CA