본문 바로가기

[오라클 레퍼런스 함수] REGEXP_COUNT - 문자열에서 패턴(pattern) 발생 횟수 반환

by ㅇㅍㅍ 2023. 8. 15.
[오라클 레퍼런스 함수] REGEXP_COUNT - 문자열에서 패턴(pattern) 발생 횟수 반환
728x90

 

 

 

 

 

REGEXP_COUNT

 

구문

REGEXP_COUNT (source_char, pattern [, position [, match_param]])

 

목적

REGEXP_COUNT 함수는 REGEXP_INSTR 함수의 기능을 보완하여 소스 문자열에서 패턴이 발생하는 횟수를 반환합니다. 이 함수는 입력 문자 집합에 따라 문자열을 평가합니다. pattern의 발생 횟수를 나타내는 정수를 반환하며, 일치하는 항목이 없으면 함수는 0을 반환합니다.

 

  • source_char은 검색 값을 나타내는 문자 표현식입니다. 일반적으로 문자열 열이며 CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB 또는 NCLOB 데이터 유형 중 하나일 수 있습니다.

  • pattern은 정규 표현식입니다. 일반적으로 텍스트 리터럴이며 CHAR, VARCHAR2, NCHAR 또는 NVARCHAR2 데이터 유형 중 하나일 수 있습니다. 최대 512바이트까지 포함할 수 있습니다. pattern의 데이터 유형이 source_char의 데이터 유형과 다른 경우 Oracle Database는 patternsource_char의 데이터 유형으로 변환합니다.

    REGEXP_COUNTpattern 내 서브 표현식 괄호를 무시합니다. 예를 들어, 패턴 '(123(45))'은 '12345'와 동등합니다. pattern에서 지정할 수 있는 연산자 목록은 Oracle Regular Expression Support을 참조하십시오.

  • position은 Oracle이 검색을 시작해야 할 source_char의 문자를 나타내는 양의 정수입니다. 기본값은 1로, Oracle은 source_char의 첫 번째 문자에서 검색을 시작합니다. pattern의 첫 번째 항목을 찾은 후 데이터베이스는 첫 번째 항목 다음의 첫 번째 문자부터 시작하여 두 번째 항목을 찾습니다.

  • match_param은 함수의 기본 일치 동작을 변경할 수 있는 VARCHAR2 또는 CHAR 데이터 유형의 문자 표현식입니다.

    match_param의 값에는 다음 중 하나 이상의 문자를 포함할 수 있습니다:
    º 'i'는 조건의 결정된 정렬이 대소문자 구분인 경우에도 대소문자 구분 없는 일치를 지정합니다.
    º 'c'는 조건의 결정된 정렬이 대소문자 구분이나 강조 구분이 없는 경우에도 대소문자 구분 및 강조 구분을 지정합니다.
    º 'n'은 기간 (.)이 줄바꿈 문자와 일치하도록 허용합니다. 이 매개변수를 생략하면 기간은 줄바꿈 문자와 일치하지 않습니다.
    º 'm'은 소스 문자열을 여러 줄로 처리합니다. Oracle은 캐럿 (^)과 달러 기호 ($)를 소스 문자열 전체의 시작과 끝이 아닌 소스 문자열의 어느 위치에서든 각각 줄의 시작과 끝으로 해석합니다. 이 매개변수를 생략하면 Oracle은 소스 문자열을 단일 줄로 처리합니다.
    º 'x'는 공백 문자를 무시합니다. 기본적으로 공백 문자는 자신과 일치합니다.

  • match_param의 값에 상반된 여러 문자가 포함되어 있는 경우 Oracle은 마지막 문자를 사용합니다. 예를 들어 'ic'를 지정하면 대소문자 구분 및 강조 구분이 사용됩니다. 값에 위에 나열되지 않은 문자가 포함되어 있는 경우 Oracle은 오류를 반환합니다.

    match_param을 생략하면:
    º 기본 대소문자 및 강조 구분은 REGEXP_COUNT 함수의 결정된 정렬에 의해 결정됩니다.
    º 기간 (.)은 줄바꿈 문자와 일치하지 않습니다.
    º 소스 문자열은 단일 줄로 처리됩니다.

 

참고:

Oracle Database Globalization Support Guide의 부록 C는 REGEXP_COUNTsource_char의 문자와 pattern의 문자를 비교할 때 사용하는 정렬 결정 규칙(collation determination rules)에 대한 정보를 제공합니다.

 

예제

다음 예제에서는 pattern 내의 하위 표현식 괄호가 무시되는 것을 보여줍니다:

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

 

다음 예제에서는 함수가 소스 문자열을 세 번째 문자부터 평가하기 시작하므로 pattern의 첫 번째 발생을 건너뜁니다:

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

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

 

REGEXP_COUNT simple matching: 예제

다음 예제에서는 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가 주어진 패턴에 대해 제공된 문자열을 유효성 검사하고 알파벳 문자 뒤에 따르는 단일 숫자의 개수를 반환합니다:

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가 주어진 패턴에 대해 제공된 문자열을 유효성 검사하고 문자열의 시작 부분에 있는 알파벳 문자 뒤에 따르는 단일 숫자의 개수를 반환합니다:

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가 주어진 패턴에 대해 제공된 문자열을 유효성 검사하고 문자열 내에서만 포함된 알파벳 문자 다음에 따르는 두 자릿수의 숫자의 개수를 반환합니다:

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가 주어진 패턴에 대해 제공된 문자열을 유효성 검사하고 문자열의 시작부터 처음 두 번째까지의 발생에서만 알파벳 문자 다음에 따라오는 한 자릿수 숫자의 개수를 반환합니다:

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 simple matching에 대한 관련 예제를 Oracle Live SQL에서 보고 실행해보세요.

 

REGEXP_COUNT advanced matching: 예제

다음 예제에서는 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 함수가 지정된 패턴을 기준으로 제공된 문자열을 유효성 검사하고 알파벳 글자 다음에 따르는 한 자리 숫자의 수를 반환합니다:

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 함수가 지정된 패턴을 기준으로 제공된 문자열을 유효성 검사하고 문자열의 시작 부분에만 나타나는 알파벳 글자 다음에 한 자리 숫자의 수를 반환합니다:

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 함수가 지정된 패턴을 기준으로 제공된 문자열을 유효성 검사하고 문자열 내에서만 나타나는 알파벳 글자 다음에 두 자리 숫자의 수를 반환합니다:

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 함수가 지정된 패턴을 기준으로 제공된 문자열을 유효성 검사하고 문자열의 시작 부분에서 처음 두 번의 발생 내에서만 나타나는 알파벳 글자 다음에 한 자리 숫자의 수를 반환합니다:

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: Oracle Live SQL에서 관련 예제를 보고 실행해보세요. REGEXP_COUNT advanced matching에서 확인할 수 있습니다.

 

REGEXP_COUNT case-sensitive matching: 예제

다음 문장들은 테이블 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

 

Oracle Live SQL에서 관련 예제를 보고 실행하려면 REGEXP_COUNT case-sensitive matching을 참조하세요.

 


출처: 오라클 레퍼런스

원문 링크: Oracle REGEXP_COUNT 함수 문서

 

반응형

댓글