REGEXP_REPLACE

REGEXP_REPLACE

REGEXP_REPLACE 함수는 subject에서 지정된 패턴, 또는 패턴의 모든 출현을 제거하거나 대체 문자열로 바꿔 반환해요.

출처: 문서

본문

문법 (Syntax)

 REGEXP_REPLACE( <subject> ,
                 <pattern>
                   [ , <replacement>
                     [ , <position>
                       [ , <occurrence>
                         [ , <parameters> ]
                       ]
                     ]
                   ]
)

인자 (Arguments)

필수 (Required):

  • subject — 일치 항목을 검색할 문자열이에요.
  • pattern — 일치시킬 패턴이에요. 패턴 지정에 대한 지침은 문자열 함수 (정규식)을 참조하세요.

선택 (Optional):

  • replacement — 패턴과 일치하는 부분 문자열을 대체하는 문자열이에요. 빈 문자열을 지정하면 함수는 일치하는 모든 패턴을 제거하고 결과 문자열을 반환해요. 기본값: ''(빈 문자열).
  • position — 함수가 일치 항목 검색을 시작하는 문자열의 시작부터의 문자 수예요. 값은 양의 정수여야 해요. 기본값: 1 (일치 검색은 왼쪽의 첫 번째 문자에서 시작).
  • occurrence — 대체할 패턴의 출현을 지정해요. 0을 지정하면 모든 출현이 대체돼요. 기본값: 0 (모든 출현).

parameters — 일치 항목 검색에 사용되는 파라미터를 지정하는 하나 이상의 문자로 이루어진 문자열이에요. 지원되는 값:

파라미터 (Parameter) 설명 (Description)
c 대소문자 구분 일치 (Case-sensitive matching)
i 대소문자 비구분 일치 (Case-insensitive matching)
m 다중 행 모드 (Multi-line mode)
e 하위 일치 추출 (Extract submatches)
s 단일 행 모드, POSIX 와일드카드 문자 .가 \n과 일치

기본값: c

자세한 내용은 정규식 파라미터 지정(Specifying the parameters for the regular expression)을 참조하세요.

반환 (Returns)

VARCHAR 타입의 값을 반환해요. 2026_04 BCR 번들이 활성화되고 subject가 대조(collated)되면 subject의 대조가 반환 값에 전파돼요. 대조되지 않은 결과를 얻으려면 subject에 COLLATE ''를 적용하세요.

일치 항목을 찾지 못하면 원래 subject를 반환해요.

인자 중 하나라도 NULL이면 NULL을 반환해요.

사용 메모 (Usage notes)

  • 대체 문자열에는 캡처 그룹에 대한 역참조(backreference)가 포함될 수 있어요. 예를 들어 패턴의 하위 표현식 같은 것. 캡처 그룹은 괄호 ( )로 묶인 정규식이에요. 캡처 그룹의 최대 개수는 9개예요. 역참조는 캡처 그룹 안의 표현식과 일치해요. 역참조는 n 형태이며, 여기서 n은 캡처 그룹의 일치 인스턴스를 참조하는 0부터 9까지(포함)의 값이에요. 자세한 내용은 이 주제의 예제(Examples)를 참조하세요.
  • 괄호 ( )와 대괄호 [ ]는 현재 리터럴 문자열로 파싱하려면 이중 이스케이프해야 해요. 아래 예제는 괄호를 제거하는 방법을 보여줘요: SELECT REGEXP_REPLACE('Customers - (NY)','\\\\(|\\\\)','') AS customers; 결과: Customers - NY.
  • 추가 사용 메모는 정규식 함수에 대한 일반 사용 메모(General usage notes for regular expression functions)를 참조하세요.

대조(collation) 세부사항

2026_04 BCR 번들이 활성화되면 이 함수는 대조 지정이 있는 인자를 받아들여요. 대조는 패턴 일치에 영향을 주지 않아요. 대조는 파라미터 인자에 i 플래그를 전달하지 않는 한 항상 대소문자를 구분해요.

예제 (Examples)

다음 예제는 문자열의 모든 공백을 아무것도 아닌 것으로 대체해요 (즉 모든 공백이 제거됨):

SELECT REGEXP_REPLACE('It was the best of times, it was the worst of times',
                      '( ){1,}',
                      '') AS result;
+------------------------------------------+
| RESULT                                   |
|------------------------------------------|
| Itwasthebestoftimes,itwastheworstoftimes |
+------------------------------------------+

다음 예제는 times라는 문자열과 일치해 days라는 문자열로 대체해요. 일치는 문자열의 첫 번째 문자에서 시작하며 부분 문자열의 두 번째 출현을 대체해요:

SELECT REGEXP_REPLACE('It was the best of times, it was the worst of times',
                      'times',
                      'days',
                      1,
                      2) AS result;
+----------------------------------------------------+
| RESULT                                             |
|----------------------------------------------------|
| It was the best of times, it was the worst of days |
+----------------------------------------------------+

다음 예제는 역참조를 사용해 firstname middlename lastname 문자열을 lastname, firstname middlename으로 재배열하고 lastname과 firstname 사이에 쉼표를 삽입해요:

SELECT REGEXP_REPLACE('firstname middlename lastname',
                      '(.*) (.*) (.*)',
                      '\\3, \\1 \\2') AS name_sort;
+--------------------------------+
| NAME_SORT                      |
|--------------------------------|
| lastname, firstname middlename |
+--------------------------------+

나머지 예제는 다음 테이블의 데이터를 사용해요:

CREATE OR REPLACE TABLE regexp_replace_demo(body VARCHAR(255));

INSERT INTO regexp_replace_demo values
  ('Hellooo World'),
  ('How are you doing today?'),
  ('the quick brown fox jumps over the lazy dog'),
  ('PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS');

다음 예제는 빈 그룹 ()를 사용해 subject의 시작과 끝을 포함해 모든 문자 사이에 * 문자를 삽입해요. 빈 그룹은 임의의 두 문자 사이에서 일치 항목을 찾아요:

SELECT body,
       REGEXP_REPLACE(body, '()', '*') AS replaced
  FROM regexp_replace_demo;
+---------------------------------------------+-----------------------------------------------------------------------------------------+
| BODY                                        | REPLACED                                                                                |
|---------------------------------------------+-----------------------------------------------------------------------------------------|
| Hellooo World                               | *H*e*l*l*o*o*o* *W*o*r*l*d*                                                             |
| How are you doing today?                    | *H*o*w* *a*r*e* *y*o*u* *d*o*i*n*g* *t*o*d*a*y*?*                                       |
| the quick brown fox jumps over the lazy dog | *t*h*e* *q*u*i*c*k* *b*r*o*w*n* *f*o*x* *j*u*m*p*s* *o*v*e*r* *t*h*e* *l*a*z*y* *d*o*g* |
| PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS     | *P*A*C*K* *M*Y* *B*O*X* *W*I*T*H* *F*I*V*E* *D*O*Z*E*N* *L*I*Q*U*O*R* *J*U*G*S*         |
+---------------------------------------------+-----------------------------------------------------------------------------------------+

다음 예제는 순서나 대소문자와 무관하게 모음 전체를 아무것도 아닌 것으로 대체해 제거해요:

SELECT body,
       REGEXP_REPLACE(body, '[aeiou]', '', 1, 0, 'i') AS replaced
  FROM regexp_replace_demo;
+---------------------------------------------+----------------------------------+
| BODY                                        | REPLACED                         |
|---------------------------------------------+----------------------------------|
| Hellooo World                               | Hll Wrld                         |
| How are you doing today?                    | Hw r y dng tdy?                  |
| the quick brown fox jumps over the lazy dog | th qck brwn fx jmps vr th lzy dg |
| PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS     | PCK MY BX WTH FV DZN LQR JGS     |
+---------------------------------------------+----------------------------------+

다음 예제는 단어 경계(\b) 뒤에 0개 이상의 단어 문자(\S), 문자 o, 그 다음 다음 단어 경계까지 0개 이상의 단어 문자가 오는 패턴과 일치시켜 subject에서 소문자 o를 포함하는 모든 단어를 제거해요:

SELECT body,
       REGEXP_REPLACE(body, '\\b(\\S*)o(\\S*)\\b') AS replaced
  FROM regexp_replace_demo;
+---------------------------------------------+-----------------------------------------+
| BODY                                        | REPLACED                                |
|---------------------------------------------+-----------------------------------------|
| Hellooo World                               |                                         |
| How are you doing today?                    |  are   ?                                |
| the quick brown fox jumps over the lazy dog | the quick   jumps  the lazy             |
| PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS     | PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS |
+---------------------------------------------+-----------------------------------------+

다음 예제는 소문자 o를 포함하는 모든 단어를 대체하며, 첫 번째 o 앞뒤의 문자를 바꾸고 o를 @@ 문자 시퀀스로 대체해요:

SELECT body,
       REGEXP_REPLACE(body, '\\b(\\S*)o(\\S*)\\b', '\\2@@\\1') AS replaced
  FROM regexp_replace_demo;
+---------------------------------------------+-------------------------------------------------+
| BODY                                        | REPLACED                                        |
|---------------------------------------------+-------------------------------------------------|
| Hellooo World                               | @@Helloo rld@@W                                 |
| How are you doing today?                    | w@@H are u@@y ing@@d day@@t?                    |
| the quick brown fox jumps over the lazy dog | the quick wn@@br x@@f jumps ver@@ the lazy g@@d |
| PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS     | PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS         |
+---------------------------------------------+-------------------------------------------------+

다음 예제는 이전 예제와 같지만 대체가 subject의 위치 3에서 시작해요:

SELECT body,
       REGEXP_REPLACE(body, '\\b(\\S*)o(\\S*)\\b', '\\2@@\\1', 3) AS replaced
  FROM regexp_replace_demo;
+---------------------------------------------+-------------------------------------------------+
| BODY                                        | REPLACED                                        |
|---------------------------------------------+-------------------------------------------------|
| Hellooo World                               | He@@lloo rld@@W                                 |
| How are you doing today?                    | How are u@@y ing@@d day@@t?                     |
| the quick brown fox jumps over the lazy dog | the quick wn@@br x@@f jumps ver@@ the lazy g@@d |
| PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS     | PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS         |
+---------------------------------------------+-------------------------------------------------+

다음 예제는 이전 예제와 같지만 subject의 위치 3에서 시작해 세 번째 출현만 대체해요:

SELECT body,
       REGEXP_REPLACE(body, '\\b(\\S*)o(\\S*)\\b', '\\2@@\\1', 3, 3) AS replaced
  FROM regexp_replace_demo;
+---------------------------------------------+----------------------------------------------+
| BODY                                        | REPLACED                                     |
|---------------------------------------------+----------------------------------------------|
| Hellooo World                               | Hellooo World                                |
| How are you doing today?                    | How are you doing day@@t?                    |
| the quick brown fox jumps over the lazy dog | the quick brown fox jumps ver@@ the lazy dog |
| PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS     | PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS      |
+---------------------------------------------+----------------------------------------------+

다음 예제는 이전 예제와 같지만 대소문자 비구분 일치를 사용해요:

SELECT body,
       REGEXP_REPLACE(body, '\\b(\\S*)o(\\S*)\\b', '\\2@@\\1', 3, 3, 'i') AS replaced
  FROM regexp_replace_demo;
+---------------------------------------------+----------------------------------------------+
| BODY                                        | REPLACED                                     |
|---------------------------------------------+----------------------------------------------|
| Hellooo World                               | Hellooo World                                |
| How are you doing today?                    | How are you doing day@@t?                    |
| the quick brown fox jumps over the lazy dog | the quick brown fox jumps ver@@ the lazy dog |
| PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS     | PACK MY BOX WITH FIVE DOZEN R@@LIQU JUGS     |
+---------------------------------------------+----------------------------------------------+

더 알아보기 (Learn more)