본문 바로가기

[오라클 레퍼런스 함수] REGEXP_REPLACE - 정규 표현식 패턴 검색 후 문자열 대체

by ㅇㅍㅍ 2023. 8. 15.
[오라클 레퍼런스 함수] REGEXP_REPLACE - 정규 표현식 패턴 검색 후 문자열 대체
728x90

 

 

 

REGEXP_REPLACE

 

구문

REGEXP_REPLACE ( source_char, pattern
                 [, replace_string
                    [, position
                       [, occurrence
                          [, match_param ]
                       ]
                    ]
                 ]
               )

 

목적

REGEXP_REPLACEREPLACE 함수의 기능을 확장하여 문자열에서 정규 표현식 패턴을 검색할 수 있게 해줍니다. 기본적으로 이 함수는 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는 patternsource_char의 데이터 유형으로 변환합니다. pattern에서 지정할 수 있는 연산자 목록에 대해서는 Oracle Regular Expression Support을 참조하십시오.

  • replace_stringCHAR, 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_paramVARCHAR2 또는 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 함수 문서

 

반응형

댓글