REGEXP_COUNT

構文

目的

REGEXP_COUNTは、ソース文字列でパターンが発生した回数を戻すことによって、REGEXP_INSTRファンクションの機能を補完します。このファンクションでは、入力文字セットによって定義された文字を使用して文字列を評価します。また、patternの発生回数を示す整数を戻します。一致する値が見つからない場合は0(ゼロ)を戻します。

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

  • patternは正規表現です。通常はテキスト・リテラルであり、データ型はCHARVARCHAR2NCHARまたはNVARCHAR2のいずれかになります。ここには、 512バイトまで入力できます。patternのデータ型がsource_charのデータ型と異なる場合、Oracleはpatternsource_charのデータ型に変換します。

    REGEXP_COUNTは、pattern内の部分正規表現のカッコを無視します。たとえば、パターン'(123(45))'は、'12345'と同じです。patternで指定できる演算子のリストは、「Oracleの正規表現のサポート」を参照してください。

  • positionは、Oracleが検索を開始する文字source_charの位置を示す正の整数です。デフォルトは1で、source_charの最初の文字から検索が開始されます。1番目のpatternの出現が検出されると、その後に続く文字以降の2番目の出現が検索されます。

  • match_paramは、データ型がVARCHAR2またはCHARの文字式であり、ファンクションのデフォルトの照合動作を変更できます。

    match_paramの値には、次の文字を1つ以上含めることができます。

    • 'i'を指定すると、条件に対して決定されている照合が大/小文字の区別ありであっても、大/小文字の区別なしでの照合となります。

    • 'c'を指定すると、条件に対して決定されている照合が大/小文字の区別なしまたはアクセントの区別なしの場合でも、大/小文字の区別あり、アクセントの区別ありでの照合となります。

    • 'n': 任意の文字に一致する文字であるピリオド(.)を、改行文字の一致に使用します。このパラメータを指定しない場合、ピリオドは改行文字には一致しません。

    • 'm': ソース文字列を複数行として処理します。Oracleは、キャレット( ^)およびドル記号($)を、それぞれ、ソース文字列全体の開始または終了としてのみではなく、ソース文字列内の任意の場所にある任意の行の開始または終了としても解釈します。このパラメータを指定しない場合、Oracleはソース文字列を単一行として処理します。

    • 'x'は空白文字を無視します。デフォルトでは、空白文字は空白文字として一致します。

    相反する文字がmatch_paramの値に複数含まれている場合は、最後の文字が使用されます。たとえば、'ic'を指定した場合は、大/小文字の区別あり、アクセントの区別ありでの照合が使用されます。値に前述以外の文字が含まれている場合は、エラーが戻されます。

    match_paramを指定しない場合、次のようになります。

    • 大/小文字およびアクセントを区別するかどうかのデフォルトは、REGEXP_COUNTファンクションに対して決定されている照合によって決まります。

    • ピリオド(.)は改行文字に一致しません。

    • ソース文字列は単一行として処理されます。

関連項目:

source_charの文字をpatternの文字と比較するためにREGEXP_COUNTで使用する照合を定義する照合決定ルールは、『Oracle Databaseグローバリゼーション・サポート・ガイド』の付録Cを参照してください。

次の例では、pattern内の部分正規表現のカッコが無視されることを示します。

SELECT REGEXP_COUNT('123123123123123', '(12)3', 1, 'i') REGEXP_COUNT
   FROM DUAL;
 
REGEXP_COUNT
------------
           5

次の例では、ファンクションは3番目の文字でソース文字列の評価を開始するため、patternの最初の出現はスキップされます。

SELECT REGEXP_COUNT('123123123123', '123', 3, 'i') COUNT FROM DUAL; 

     COUNT
----------
         3

REGEXP_COUNTの単純な一致: 例

次の例では、REGEXP_COUNTは指定されたパターンの入力文字列を検証し、アルファベット文字の数を戻します。

select regexp_count('ABC123', '[A-Z]'), regexp_count('A1B2C3', '[A-Z]') from dual;

REGEXP_COUNT('ABC123','[A-Z]') REGEXP_COUNT('A1B2C3','[A-Z]')
------------------------------ ------------------------------
			     3				    3

次の例では、REGEXP_COUNTは指定されたパターンの入力文字列を検証し、1桁の数字が続くアルファベット文字の数を戻します。

select regexp_count('ABC123', '[A-Z][0-9]'), regexp_count('A1B2C3', '[A-Z][0-9]') from dual;

REGEXP_COUNT('ABC123','[A-Z][0-9]') REGEXP_COUNT('A1B2C3','[A-Z][0-9]')
----------------------------------- -----------------------------------
				  1				      3

次の例では、REGEXP_COUNTは指定されたパターンの入力文字列を検証し、文字列の先頭にあるものにかぎり、1桁の数字が続くアルファベット文字の数を戻します。

select regexp_count('ABC123', '[A-Z][0-9]'), regexp_count('A1B2C3', '[A-Z][0-9]') from dual;

REGEXP_COUNT('ABC123','^[A-Z][0-9]') REGEXP_COUNT('A1B2C3','^[A-Z][0-9]')
------------------------------------ ------------------------------------
				   0					1

次の例では、REGEXP_COUNTは指定されたパターンの入力文字列を検証し、文字列中に含まれるものにかぎり、2桁の数字が続くアルファベット文字の数を戻します。

select regexp_count('ABC123', '[A-Z][0-9]{2}'), regexp_count('A1B2C3', '[A-Z][0-9]{2}') from dual;

REGEXP_COUNT('ABC123','[A-Z][0-9]{2}') REGEXP_COUNT('A1B2C3','[A-Z][0-9]{2}')
-------------------------------------- --------------------------------------
				     1					    0

次の例では、REGEXP_COUNTは指定されたパターンの入力文字列を検証し、文字列の先頭から最初の2回の出現の中で、1桁の数字が続くアルファベット文字の数を戻します。

select regexp_count('ABC123', '([A-Z][0-9]){2}'), regexp_count('A1B2C3', '([A-Z][0-9]){2}') from dual;

REGEXP_COUNT('ABC123','([A-Z][0-9]){2}') REGEXP_COUNT('A1B2C3','([A-Z][0-9]){2}')
---------------------------------------- ----------------------------------------
                                       0                                        1

Live SQL:

REGEXP_COUNTの単純な一致で、Oracle Live SQLに関連する例を参照および実行します

REGEXP_COUNTの詳細な一致: 例

次の例では、REGEXP_COUNTは指定されたパターンの入力文字列を検証し、アルファベット文字の数を戻します。

select regexp_count('ABC123', '[A-Z]') Match_char_ABC_count, 
regexp_count('A1B2C3', '[A-Z]') Match_char_ABC_count from dual;

MATCH_CHAR_ABC_COUNT MATCH_CHAR_ABC_COUNT
-------------------- --------------------
		   3			3

次の例では、REGEXP_COUNTは指定されたパターンの入力文字列を検証し、1桁の数字が続くアルファベット文字の数を戻します。

select regexp_count('ABC123', '[A-Z][0-9]') Match_string_C1_count, 
regexp_count('A1B2C3', '[A-Z][0-9]')  Match_strings_A1_B2_C3_count from dual;

MATCH_STRING_C1_COUNT MATCH_STRINGS_A1_B2_C3_COUNT
--------------------- ----------------------------
		    1				 3

次の例では、REGEXP_COUNTは指定されたパターンの入力文字列を検証し、文字列の先頭にあるものにかぎり、1桁の数字が続くアルファベット文字の数を戻します。

select regexp_count('ABC123A5', '^[A-Z][0-9]') Char_num_like_A1_at_start, 
regexp_count('A1B2C3', '^[A-Z][0-9]') Char_num_like_A1_at_start from dual;

CHAR_NUM_LIKE_A1_AT_START CHAR_NUM_LIKE_A1_AT_START
------------------------- -------------------------
			0			  1

次の例では、REGEXP_COUNTは指定されたパターンの入力文字列を検証し、文字列中に含まれるものにかぎり、2桁の数字が続くアルファベット文字の数を戻します。

select regexp_count('ABC123', '[A-Z][0-9]{2}') Char_num_like_A12_anywhere, 
regexp_count('A1B2C34', '[A-Z][0-9]{2}') Char_num_like_A12_anywhere from dual;

CHAR_NUM_LIKE_A12_ANYWHERE CHAR_NUM_LIKE_A12_ANYWHERE
-------------------------- --------------------------
			 1			    1

次の例では、REGEXP_COUNTは指定されたパターンの入力文字列を検証し、文字列の先頭から最初の2回の出現の中で、1桁の数字が続くアルファベット文字の数を戻します。

select regexp_count('ABC12D3', '([A-Z][0-9]){2}') Char_num_within_2_places, 
regexp_count('A1B2C3', '([A-Z][0-9]){2}') Char_num_within_2_places from dual;

CHAR_NUM_WITHIN_2_PLACES CHAR_NUM_WITHIN_2_PLACES
------------------------ ------------------------
		       0			1

Live SQL:

REGEXP_COUNTの詳細な一致で、Oracle Live SQLに関連する例を参照および実行します

REGEXP_COUNTの大/小文字を区別した一致: 例

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

CREATE TABLE regexp_temp(empName varchar2(20));

INSERT INTO regexp_temp (empName) VALUES ('John Doe');
INSERT INTO regexp_temp (empName) VALUES ('Jane Doe');

次の例では、この文は従業員名の列を問合せ、文字「E」の小文字を検索します。

SELECT empName, REGEXP_COUNT(empName, 'e', 1, 'c') "CASE_SENSITIVE_E" From regexp_temp;

EMPNAME 	     CASE_SENSITIVE_E
-------------------- ----------------
John Doe			    1
Jane Doe			    2

次の例では、この文は従業員名の列を問合せ、文字「O」の小文字を検索します。

SELECT empName, REGEXP_COUNT(empName, 'o', 1, 'c') "CASE_SENSITIVE_O" From regexp_temp;

EMPNAME 	     CASE_SENSITIVE_O
-------------------- ----------------
John Doe			    2
Jane Doe			    1

次の例では、この文は従業員名の列を問合せ、文字「E」の小文字または大文字を検索します。

SELECT empName, REGEXP_COUNT(empName, 'E', 1, 'i') "CASE_INSENSITIVE_E" From regexp_temp;

EMPNAME 	     CASE_INSENSITIVE_E
-------------------- ------------------
John Doe			      1
Jane Doe			      2

次の例では、この文は従業員名の列を問合せ、文字列「DO」の小文字を検索します。

SELECT empName, REGEXP_COUNT(empName, 'do', 1, 'i') "CASE_INSENSITIVE_STRING" From regexp_temp;

EMPNAME 	     CASE_INSENSITIVE_STRING
-------------------- -----------------------
John Doe				   1
Jane Doe				   1

次の例では、この文は従業員名の列を問合せ、文字列「AN」の小文字または大文字を検索します。

SELECT empName, REGEXP_COUNT(empName, 'an', 1, 'c') "CASE_SENSITIVE_STRING" From regexp_temp;

EMPNAME 	     CASE_SENSITIVE_STRING
-------------------- ---------------------
John Doe				 0
Jane Doe				 1

Live SQL:

REGEXP_COUNTの大/小文字を区別した一致で、Oracle Live SQLに関連する例を参照および実行します