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는 pattern을 source_char의 데이터 유형으로 변환합니다.
REGEXP_COUNT는 pattern 내 서브 표현식 괄호를 무시합니다. 예를 들어, 패턴 '(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_COUNT가 source_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 함수 문서
댓글