REGEXP_REPLACE
구문
REGEXP_REPLACE ( source_char, pattern
[, replace_string
[, position
[, occurrence
[, match_param ]
]
]
]
)
목적
REGEXP_REPLACE는 REPLACE 함수의 기능을 확장하여 문자열에서 정규 표현식 패턴을 검색할 수 있게 해줍니다. 기본적으로 이 함수는 source_char에서 정규 표현식 패턴의 모든 발생을 replace_string으로 대체한 문자열을 반환합니다. 반환된 문자열은 source_char와 동일한 문자 집합을 사용합니다. 첫 번째 인수가 LOB가 아닌 경우 VARCHAR2를 반환하며, 첫 번째 인수가 LOB인 경우 CLOB를 반환합니다.
이 함수는 POSIX 정규 표현식 표준과 Unicode 정규 표현식 가이드라인을 준수합니다. 자세한 정보는 Oracle Regular Expression Support을 참조하십시오.
- source_char는 검색 값을 제공하는 문자 표현식입니다. 일반적으로 문자열 열(column)이며 CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB 또는 NCLOB 데이터 유형일 수 있습니다.
- pattern은 정규 표현식입니다. 일반적으로 텍스트 리터럴이며 CHAR, VARCHAR2, NCHAR 또는 NVARCHAR2 데이터 유형일 수 있습니다. 최대 512 바이트까지 포함할 수 있습니다. pattern의 데이터 유형이 source_char의 데이터 유형과 다르면 Oracle Database는 pattern을 source_char의 데이터 유형으로 변환합니다. pattern에서 지정할 수 있는 연산자 목록에 대해서는 Oracle Regular Expression Support을 참조하십시오.
- replace_string은 CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB 또는 NCLOB 데이터 유형일 수 있습니다. replace_string이 CLOB 또는 NCLOB인 경우 Oracle은 replace_string을 32K로 자릅니다. replace_string은 1부터 9까지의 숫자 n을 \n 형식으로 지원하는 서브표현식에 대한 최대 500개의 역참조를 포함할 수 있습니다. replace_string에 백슬래시()를 포함하려면 백슬래시로 시작하는 이스케이프 문자로 표시해야 합니다. 예를 들어, \2를 대체하려면 \2를 입력해야 합니다. 백참조 식(backreference expressions)에 대한 자세한 정보는 "Oracle 정규 표현식 지원" 참조 노트, 표 D-1을 참조하십시오.
- position은 Oracle이 검색을 시작할 source_char의 문자를 나타내는 양의 정수입니다. 기본값은 1이며, 이는 Oracle이 source_char의 첫 번째 문자에서 검색을 시작함을 의미합니다.
- occurrence는 대체 작업의 발생을 나타내는 음수가 아닌 정수입니다:
º 0을 지정하면 Oracle은 일치하는 모든 발생을 대체합니다.
º 양의 정수 n을 지정하면 Oracle은 n번째 발생을 대체합니다.
occurrence가 1보다 크면 데이터베이스는 pattern의 첫 번째 발생 다음 첫 번째 문자에서 두 번째 발생을 검색하고 이와 같은 식으로 진행합니다. 이 동작은 INSTR 함수와 다르며, INSTR 함수는 두 번째 발생의 검색을 첫 번째 발생의 두 번째 문자에서 시작합니다. - match_param은 VARCHAR2 또는 CHAR 데이터 유형의 문자 표현식으로, 함수의 기본 일치 동작을 변경할 수 있게 해줍니다. 이 매개변수의 동작은 REGEXP_COUNT 함수와 같습니다. 자세한 정보는 REGEXP_COUNT를 참조하십시오.
참고:
- REPLACE
- REGEXP_INSTR, REGEXP_SUBSTR 및 REGEXP_LIKE 조건
- Oracle Database Globalization Support Guide의 부록 C는 REGEXP_REPLACE 함수가 source_char의 문자와 pattern의 문자를 비교하는 데 사용하는 정렬 결정 규칙(collation determination rules) 및 문자 반환 값에 할당되는 정렬을 정의하는 정렬 파생 규칙(collation derivation rules)에 대한 정보를 제공합니다.
예제
다음 예제는 phone_number를 조사하여 패턴 xxx.xxx.xxxx를 찾습니다. Oracle은 이 패턴을 (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을 조사합니다. Oracle은 문자열의 각 비어 있지 않은 문자 뒤에 공백을 추가합니다.
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
. . .
다음 예제는 문자열을 조사하여 두 개 이상의 공백을 찾습니다. Oracle은 두 개 이상의 공백이 발생하는 각 경우를 단일 공백으로 대체합니다.
SELECT
REGEXP_REPLACE('500 Oracle Parkway, Redwood Shores, CA',
'( ){2,}', ' ') "REGEXP_REPLACE"
FROM DUAL;
REGEXP_REPLACE
--------------------------------------
500 Oracle Parkway, Redwood Shores, CA
REGEXP_REPLACE pattern matching: 예제
다음 문장은 테이블 "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@example.com');
다음 문장은 문자열 'Jane'을 'John'으로 대체합니다.
SELECT empName, REGEXP_REPLACE (empName, 'Jane', 'John') "STRING_REPLACE" FROM regexp_temp;
EMPNAME STRING_REPLACE
-------- --------------
John Doe John Doe
Jane Doe John Doe
다음 문장은 문자열 'John'을 'Jane'으로 대체합니다.
SELECT empName, REGEXP_REPLACE (empName, 'John', 'Jane' ) "STRING_REPLACE" FROM regexp_temp;
EMPNAME STRING_REPLACE
-------- --------------
John Doe Jane Doe
Jane Doe Jane Doe
REGEXP_REPLACE: 예제
다음 문장은 문자열 내의 모든 숫자를 대체합니다.
WITH strings AS (
SELECT 'abc123' s FROM dual union all
SELECT '123abc' s FROM dual union all
SELECT 'a1b2c3' s FROM dual
)
SELECT s "STRING", regexp_replace(s, '[0-9]', '') "MODIFIED_STRING"
FROM strings;
STRING MODIFIED_STRING
-------------------- --------------------
abc123 abc
123abc abc
a1b2c3 abc
다음 문장은 문자열 내에서 첫 번째 숫자 발생을 대체합니다.
WITH strings AS (
SELECT 'abc123' s from DUAL union all
SELECT '123abc' s from DUAL union all
SELECT 'a1b2c3' s from DUAL
)
SELECT s "STRING", REGEXP_REPLACE(s, '[0-9]', '', 1, 1) "MODIFIED_STRING"
FROM strings;
STRING MODIFIED_STRING
-------------------- --------------------
abc123 abc23
123abc 23abc
a1b2c3 ab2c3
다음 문장은 문자열 내에서 두 번째 숫자 발생을 대체합니다.
WITH strings AS (
SELECT 'abc123' s from DUAL union all
SELECT '123abc' s from DUAL union all
SELECT 'a1b2c3' s from DUAL
)
SELECT s "STRING", REGEXP_REPLACE(s, '[0-9]', '', 1, 2) "MODIFIED_STRING"
FROM strings;
STRING MODIFIED_STRING
-------------------- --------------------
abc123 abc13
123abc 13abc
a1b2c3 a1bc3
다음 문장은 문자열 내에서 여러 개의 공백을 하나의 공백으로 대체합니다.
WITH strings AS (
SELECT 'Hello World' s FROM dual union all
SELECT 'Hello World' s FROM dual union all
SELECT 'Hello, World !' s FROM dual
)
SELECT s "STRING", regexp_replace(s, ' {2,}', ' ') "MODIFIED_STRING"
FROM strings;
STRING MODIFIED_STRING
-------------------- --------------------
Hello World Hello World
Hello World Hello World
Hello, World ! Hello, World !
다음 문장은 카멜 케이스 문자열을 밑줄로 구분된 소문자 단어를 포함하는 문자열로 변환합니다.
WITH strings as (
SELECT 'AddressLine1' s FROM dual union all
SELECT 'ZipCode' s FROM dual union all
SELECT 'Country' s FROM dual
)
SELECT s "STRING",
lower(regexp_replace(s, '([A-Z0-9])', '_\1', 2)) "MODIFIED_STRING"
FROM strings;
STRING MODIFIED_STRING
-------------------- --------------------
AddressLine1 address_line_1
ZipCode zip_code
Country country
다음 문장은 날짜의 형식을 변환합니다.
WITH date_strings AS (
SELECT '2015-01-01' d from dual union all
SELECT '2000-12-31' d from dual union all
SELECT '900-01-01' d from dual
)
SELECT d "STRING",
regexp_replace(d, '([[:digit:]]+)-([[:digit:]]{2})-([[:digit:]]{2})', '\3.\2.\1') "MODIFIED_STRING"
FROM date_strings;
STRING MODIFIED_STRING
-------------------- --------------------
2015-01-01 01.01.2015
2000-12-31 31.12.2000
900-01-01 01.01.900
다음 문장은 문자열의 모든 문자를 '1'로 대체합니다.
WITH strings as (
SELECT 'NEW YORK' s FROM dual union all
SELECT 'New York' s FROM dual union all
SELECT 'new york' s FROM dual
)
SELECT s "STRING",
regexp_replace(s, '[a-z]', '1', 1, 0, 'i') "CASE_INSENSITIVE",
regexp_replace(s, '[a-z]', '1', 1, 0, 'c') "CASE_SENSITIVE",
regexp_replace(s, '[a-zA-Z]', '1', 1, 0, 'c') "CASE_SENSITIVE_MATCHING"
FROM strings;
STRING CASE_INSEN CASE_SENSI CASE_SENSI
---------- ---------- ---------- ----------
NEW YORK 111 1111 NEW YORK 111 1111
New York 111 1111 N11 Y111 111 1111
new york 111 1111 111 1111 111 1111
출처: 오라클 레퍼런스
원문 링크: Oracle REGEXP_REPLACE 함수 문서
'코딩 > 오라클 함수' 카테고리의 다른 글
[오라클 레퍼런스 함수] REGR_ (Linear Regression) Functions - REGR_ (선형 회귀) 함수들 (0) | 2023.08.16 |
---|---|
[오라클 레퍼런스 함수] REGEXP_SUBSTR - 정규 표현식 패턴을 사용하여 부분 문자열 추출 (0) | 2023.08.16 |
[오라클 레퍼런스 함수] REGEXP_INSTR - 정규 표현식(regular expression)을 사용하여 부분 문자열 위치 반환 (0) | 2023.08.15 |
[오라클 레퍼런스 함수] REGEXP_COUNT - 문자열에서 패턴(pattern) 발생 횟수 반환 (0) | 2023.08.15 |
[오라클 레퍼런스 함수] REFTOHEX - REF 유형의 값을 16진수 표현으로 변환 (0) | 2023.08.15 |
댓글