문자열 함수(정규식)

이러한 문자열 함수는 정규식(종종 《regex》라고도 함)과 일치하는 작업을 수행합니다.

이 항목의 내용:

정규식 함수 목록

함수

참고

REGEXP

RLIKE의 별칭입니다.

REGEXP_COUNT

REGEXP_EXTRACT_ALL

REGEXP_SUBSTR_ALL의 별칭입니다.

REGEXP_INSTR

REGEXP_LIKE

RLIKE의 별칭입니다.

REGEXP_REPLACE

REGEXP_SUBSTR

REGEXP_SUBSTR_ALL

RLIKE

일반적인 사용법 노트

이 참고 사항에서 《대상》은 작업할 문자열을 지칭하고 《패턴》은 정규식을 지칭합니다.

  • 대상은 일반적으로 변수 열이고 패턴은 일반적으로 상수이지만 필수적인 것은 아닙니다. 정규식 함수에 대한 모든 인자는 상수 또는 변수가 될 수 있습니다.

  • 패턴은 전체 POSIX ERE(확장 정규식) 구문을 지원합니다. 자세한 내용은 (Wikipedia에서) POSIX 기본 및 확장 섹션을 참조하십시오.

  • 패턴은 다음 Perl 백슬래시 시퀀스도 지원합니다.

    • \d: 10진수(0~9).

    • \D: 10진수가 아닙니다.

    • \s: 공백 문자.

    • \S: 공백 문자가 아닙니다.

    • \w: 《단어》 문자(a~z, A~Z, 밑줄(《_》) 또는 10진수).

    • \W: 단어 문자가 아닙니다.

    • \b: 단어 경계선.

    • \B: 단어 경계선이 아닙니다.

    자세한 내용은 (Wikipedia에서) 문자 클래스 섹션을 참조하거나 (Perl 설명서에서) 백슬래시 시퀀스 섹션을 참조하십시오.

    참고

    작은따옴표로 묶인 문자열 상수 에서 백슬래시 시퀀스에서 백슬래시 문자를 이스케이프해야 합니다. 예를 들어 \d 를 지정하려면 \\d 를 사용하십시오. 자세한 내용은 이 항목의 작은따옴표로 묶인 문자열 상수에서 정규식 지정하기 섹션을 참조하십시오.

    문자열을 (작은따옴표가 아니라) 달러 기호 쌍($$) 으로 구분하는 경우 백슬래시를 이스케이프하지 않아도 됩니다.

  • 기본적으로, (패턴 내의) POSIX 와일드카드 문자 . 는 (대상 내의) 줄 바꿈 문자 \n 를 일치 항목으로 포함하지 않습니다.

    또한, 줄 바꿈 문자와 일치시키려면 pattern 인자에서 .(.|\n) 으로 바꾸거나 (아래에서 설명하는) parameters 인자에 s 매개 변수를 사용하십시오.

  • 모든 정규식 함수는 유니코드를 지원합니다. 단일 유니코드 문자는 그 문자에 대응하는 이진 표현의 바이트 길이와 관계없이 항상 하나의 문자로 계산됩니다(즉, POSIX 메타 문자 . 은 정확히 하나의 유니코드 문자와 일치함). 또한, 대상 오프셋을 받거나 반환하는 함수의 경우 단일 유니코드 문자는 1로 계산됩니다.

정규식에 매개 변수 지정하기

대부분의 정규식 함수는 선택적 parameters 인자를 마지막 입력으로 지원합니다. parameters 인자는 정규식 함수의 일치 동작을 지정하는 VARCHAR 문자열입니다. 다음 매개 변수가 지원됩니다.

매개 변수

효과

c

대/소문자를 구분하는 일치를 활성화합니다.

i

대/소문자를 구분하지 않는 일치를 활성화합니다.

m

여러 줄 모드를 활성화합니다(즉, 메타 문자 ^$ 는 대상 줄의 시작과 끝을 표시함). 기본적으로 여러 줄 모드는 비활성화되어 있습니다(즉, ^$ 는 전체 대상의 시작과 끝을 표시함).

e

하위 일치 항목을 추출하며, REGEXP_INSTR, REGEXP_SUBSTR, REGEXP_SUBSTR_ALL 및 이들 함수의 별칭에만 적용됩니다.

s

\n 과 일치하도록 POSIX 와일드카드 문자 . 을 활성화합니다. 기본적으로 와일드카드 문자 일치는 비활성화되어 있습니다.

기본 문자열은 단순히 c 로, 다음을 지정합니다.

  • 대/소문자를 구분하는 일치입니다.

  • 한 줄 모드.

  • 항상 하위 일치 추출을 사용하는 REGEXP_REPLACE 를 제외하면 하위 일치 추출이 없습니다.

  • POSIX 와일드카드 문자 .\n 줄 바꿈 문자와 일치하지 않습니다.

여러 매개 변수를 지정할 때 공백이나 구분 기호 없이 문자열이 입력됩니다. 예를 들어, ims 는 POSIX 와일드카드 일치를 사용하여 여러 줄 모드에서 대/소문자를 구분하지 않는 일치를 지정합니다.

ci 가 둘 다 parameters 문자열에 포함된 경우, 문자열에서 마지막에 나타나는 코드에 따라 함수가 대/소문자를 구분하는 일치 또는 대/소문자를 구분하지 않는 일치를 수행하는지 여부가 결정됩니다. 예를 들어, ci 는 《i》가 문자열의 마지막에 나오므로 대/소문자를 구분하지 않는 일치를 지정합니다.

메타 문자인 일치하는 문자

정규식에서는 일부 문자가 특정한 의미를 가진 메타 문자로 처리됩니다. 예:

  • .임의의 단일 문자와 일치하는 메타 문자 입니다.

  • * 는 0개 또는 그 이상의 선행 요소 인스턴스와 일치하는 수량자 입니다. 예를 들어 BA*B, BA, BAA 등과 일치합니다.

  • ? 는 0개 또는 한 개의 선행 요소 인스턴스와 일치하는 수량자입니다.

실제 문자(예: 실제 마침표, 별표 또는 물음표)와 일치시키려면 백슬래시(예: \., \*, \? 등)로 메타 문자를 이스케이프해야 합니다.

참고

작은따옴표로 묶인 문자열 상수 에서 정규식을 사용하는 경우 백슬래시를 또 다른 백슬래시(예: \\., \\*, \\? 등)로 이스케이프해야 합니다. 자세한 내용은 작은따옴표로 묶인 문자열 상수에서 정규식 지정하기 섹션을 참조하십시오.

예를 들어 문자열에서 여는 괄호(()를 찾아야 한다고 가정하겠습니다. 이를 지정하는 한 가지 방법은 백슬래시를 사용하여 패턴에서 문자(예: \()를 이스케이프하는 것입니다.

패턴을 작은따옴표로 묶인 문자열 상수 로 지정하는 경우에도 그 백슬래시를 또 다른 백슬래시로 이스케이프 해야 합니다.

다음 패턴은 괄호 안에 나타나는 영숫자 시퀀스와 일치합니다(예: (NY)).

SELECT REGEXP_SUBSTR('Customers - (NY)','\\([[:alnum:]]+\\)') as customers;

  +-----------+
  | CUSTOMERS |
  |-----------|
  | (NY)      |
  +-----------+

추가적인 예를 보려면 작은따옴표로 묶인 문자열 상수에서 메타 문자를 사용하는 예 섹션을 참조하십시오.

달러 기호로 묶인 문자열 상수 를 사용하는 경우 백슬래시 문자를 이스케이프할 필요가 없습니다.

SELECT REGEXP_SUBSTR('Customers - (NY)',$$\([[:alnum:]]+\)$$) as customers;

  +-----------+
  | CUSTOMERS |
  |-----------|
  | (NY)      |
  +-----------+

역참조 사용하기

Snowflake는 정규식 패턴에서 역참조(형식 언어 이론에서는 《스퀘어》로 알려짐)를 지원하지 않습니다. 하지만 역참조는 REGEXP_REPLACE 함수의 대체 문자열에서 지원됩니다.

빈 패턴 지정하기

대부분의 regexp 함수에서 빈 패턴(즉, '')은 무엇과도 일치하지 않는데, 심지어 빈 대상과도 일치하지 않습니다.

예외는 REGEXP_LIKE 와 그 별칭인 REGEXPRLIKE 로, 여기서 패턴은 양쪽 끝에 암시적으로 고정되므로 빈 패턴이 빈 주대상과 일치합니다(즉, '' 가 자동으로 '^$' 가 됨).

빈 그룹(즉, 하위 식 ())은 대상의 시작과 끝을 포함하여, 문자 사이의 공백과 일치합니다.

달러 기호로 묶인 문자열 상수에서 정규식 지정하기

문자열 상수를 사용하여 함수의 정규식을 지정하는 경우 달러 기호로 묶인 문자열 상수 를 사용하여 정규식에서 백슬래시 문자를 이스케이프 할 필요가 없도록 할 수 있습니다. (작은따옴표로 묶인 문자열 상수 를 사용하는 경우 백슬래시를 이스케이프해야 합니다.)

달러 기호로 묶인 문자열 상수의 내용은 항상 문자 그대로 해석됩니다.

예를 들어 메타 문자 를 이스케이프할 때는 단일 백슬래시만 사용해야 합니다.

SELECT w2
  FROM wildcards
  WHERE REGEXP_LIKE(w2, $$\?$$);

역참조 를 사용할 때는 단일 백슬래시만 사용하면 됩니다.

SELECT w2, REGEXP_REPLACE(w2, '(.old)', $$very \1$$)
  FROM wildcards
  ORDER BY w2;

작은따옴표로 묶인 문자열 상수에서 정규식 지정하기

작은따옴표로 묶인 문자열 상수 에서 정규식을 사용하는 경우 백슬래시 시퀀스 의 모든 백슬래시를 또 다른 백슬래시로 이스케이프해야 합니다.

참고

정규식에서 백슬래시 이스케이프를 방지하려면 작은따옴표로 묶인 문자열 상수가 아니라 달러 기호로 묶인 문자열 상수 를 사용할 수 있습니다.

예:

작은따옴표로 묶인 문자열 상수에서 메타 문자를 사용하는 예

이 예에서는 물음표(?)를 검색하는 정규식에서 이스케이프 시퀀스의 일부로서 백슬래시를 사용합니다.

테이블을 만들고 한 열에 단일 백슬래시를 포함하고 다른 열에는 물음표가 포함된 행을 삽입합니다.

create table wildcards (w varchar, w2 varchar);
insert into wildcards (w, w2) values ('\\', '?');

다음 SELECT는 물음표 리터럴을 검색합니다. 검색은 정규식을 사용하고 물음표는 정규식의 메타 문자이므로 리터럴로 처리하려면 물음표를 이스케이프해야 합니다. 백슬래시는 문자열 리터럴로 나타나기 때문에 백슬래시 자체도 이스케이프해야 하므로 쿼리는 다음과 같습니다.

select w2
    from wildcards
    where regexp_like(w2, '\\?');
+----+
| W2 |
|----|
| ?  |
+----+

다음 쿼리를 사용하면 정규식이 두 개의 문자(백슬래시 이스케이프 문자 및 물음표)로 구성되어 있음을 더 쉽게 확인할 수 있습니다.

select w2
    from wildcards
    where regexp_like(w2, '\\' || '?');
+----+
| W2 |
|----|
| ?  |
+----+

이전 예에서 추가 백슬래시는 정규식 자체가 아니라 이스케이프 문자가 문자열 리터럴의 일부 였기 때문에 필요했습니다. 다음 SELECT 문은 문자열 리터럴을 SQL 명령 문자열의 일부로서 구문 분석할 필요가 없으므로, 문자열 리터럴에 필요한 추가 이스케이프 문자가 필요하지 않습니다.

select w, w2, w || w2 as escape_sequence, w2
    from wildcards
    where regexp_like(w2, w || w2);
+---+----+-----------------+----+
| W | W2 | ESCAPE_SEQUENCE | W2 |
|---+----+-----------------+----|
| \ | ?  | \?              | ?  |
+---+----+-----------------+----+

작은따옴표로 묶인 문자열 상수에서 역참조를 사용하는 예

문자열 리터럴에서 역참조 (예: \1)를 사용하는 경우 해당 역참조의 일부인 역슬래시를 이스케이프해야 합니다. 예를 들어 REGEXP_REPLACE 의 대체 문자열 리터럴에서 역참조 \1 을 지정하려면 \\1 을 사용합니다.

다음 예에서는 앞에서 만든 테이블을 사용합니다. SELECT는 역참조를 사용하여 정규식 .old 의 각 발생을 일치하는 문자열의 복사본으로 바꿔 그 앞에 《very》라는 단어를 붙입니다.

insert into wildcards (w, w2) values (NULL, 'When I am cold, I am bold.');
select w2, regexp_replace(w2, '(.old)', 'very \\1')
    from wildcards
    order by w2;
+----------------------------+------------------------------------------+
| W2                         | REGEXP_REPLACE(W2, '(.OLD)', 'VERY \\1') |
|----------------------------+------------------------------------------|
| ?                          | ?                                        |
| When I am cold, I am bold. | When I am very cold, I am very bold.     |
+----------------------------+------------------------------------------+