[NOT] REGEXP

[NOT] REGEXP

문자열이 지정한 패턴과 일치하는지 또는 일치하지 않는지 확인하는 비교를 수행해요. 두 입력 모두 텍스트 표현식이어야 해요. REGEXP는 [NOT] LIKE 함수와 비슷하지만, SQL LIKE 패턴 구문 대신 POSIX 확장 정규 표현식을 사용해요. LIKE보다 더 복잡한 일치 조건을 지원해요.

팁: 이 함수를 호출하는 쿼리의 성능을 향상하려면 검색 최적화 서비스(search optimization service)를 사용할 수 있어요. 자세한 내용은 Search optimization service를 참고해요.

출처: Snowflake SQL Reference - [NOT] REGEXP

본문

구문

<subject> [ NOT ] REGEXP <pattern>

인자

필수:

반환 값

BOOLEAN 또는 NULL을 반환해요.

  • REGEXP가 지정되면 일치하면 값은 TRUE이고, 그렇지 않으면 FALSE를 반환해요.
  • NOT REGEXP가 지정되면 일치하지 않으면 TRUE이고, 그렇지 않으면 FALSE를 반환해요.
  • REGEXP 또는 NOT REGEXP가 지정되고 인자 중 하나라도 NULL이면 NULL을 반환해요.

사용상 주의사항

  • 함수는 양끝에서 패턴을 암시적으로 앵커링해요(예: ''는 자동으로 '^$'가 되고, 'ABC'는 자동으로 '^ABC$'가 돼요). 예를 들어 ABC로 시작하는 아무 문자열과 일치시키려면 패턴은 'ABC.*'예요.
  • 백슬래시 문자(\)는 이스케이프 문자예요. 자세한 내용은 Specifying regular expressions in single-quoted string constants를 참고해요.
  • 더 많은 사용상 주의사항은 정규 표현식 함수의 일반 사용상 주의사항을 참고해요.

컬레이션 상세

컬레이션 지정이 있는 인자는 현재 지원되지 않아요.

예시

아래 예시는 간단한 와일드카드 표현식과 함께 REGEXP를 사용하는 방법을 보여줘요.

테이블을 만들고 데이터를 적재해요.

CREATE OR REPLACE TABLE strings (v VARCHAR(50));
INSERT INTO strings (v) VALUES
  ('San Francisco'),
  ('San Jose'),
  ('Santa Clara'),
  ('Sacramento');

와일드카드를 사용해 패턴을 검색해요.

SELECT v
  FROM strings
  WHERE v REGEXP 'San* [fF].*'
  ORDER BY v;

+---------------+
| V             |
|---------------|
| San Francisco |
+---------------+

백슬래시 문자 \는 정규 표현식에서 이스케이프 문자이며, 특수 문자나 문자 그룹을 지정해요. 예를 들어 \s는 공백의 정규 표현식이에요. Snowflake 문자열 파서는 리터럴 문자열을 구문 분석하며 백슬래시도 이스케이프 문자로 취급해요. 예를 들어 탭 문자를 지정하는 문자 시퀀스의 일부로 백슬래시가 사용돼요. 따라서 단일 백슬래시를 포함하는 문자열을 만들려면 백슬래시 두 개를 지정해야 해요. 아래 입력 문의 문자열을 출력의 해당 문자열과 비교해 보세요.

INSERT INTO strings (v) VALUES
  ('Contains embedded single \\backslash');

SELECT *
  FROM strings
  ORDER BY v;

+-------------------------------------+
| V                                   |
|-------------------------------------|
| Contains embedded single \backslash |
| Sacramento                          |
| San Francisco                       |
| San Jose                            |
| Santa Clara                         |
+-------------------------------------+

이 예시는 San으로 시작하되 San이 완전한 단어인(예: Santa의 일부가 아닌) 문자열을 검색하는 방법을 보여줘요. \b는 단어 경계의 이스케이프 시퀀스예요.

SELECT v, v REGEXP 'San\\b.*' AS matches
  FROM strings
  ORDER BY v;

+-------------------------------------+---------+
| V                                   | MATCHES |
|-------------------------------------+---------|
| Contains embedded single \backslash | False   |
| Sacramento                          | False   |
| San Francisco                       | True    |
| San Jose                            | True    |
| Santa Clara                         | False   |
+-------------------------------------+---------+

이 예시는 공백 뒤에 백슬래시가 오는 것을 검색하는 방법을 보여줘요. 검색할 단일 백슬래시는 아래에서 네 개의 백슬래시로 표현돼 있어요. REGEXP가 리터럴 백슬래시를 찾으려면 그 백슬래시가 이스케이프되어야 하므로 백슬래시 두 개가 필요해요. 문자열 파서는 그 각각의 백슬래시를 이스케이프해야 하므로, 표현식이 검색하는 하나의 백슬래시를 나타내기 위해 표현식에는 네 개의 백슬래시가 포함돼요.

SELECT v, v REGEXP '.*\\\\s\\\\\\\\.*' AS matches
  FROM strings
  ORDER BY v;

+-------------------------------------+---------+
| V                                   | MATCHES |
|-------------------------------------+---------|
| Contains embedded single \backslash | True    |
| Sacramento                          | False   |
| San Francisco                       | False   |
| San Jose                            | False   |
| Santa Clara                         | False   |
+-------------------------------------+---------+

다음 예시는 앞선 예시와 같지만 문자열 구분 기호로 $$를 사용해 문자열 파서에게 문자열이 리터럴이며 백슬래시를 이스케이프 시퀀스로 해석하면 안 된다는 것을 알려줘요. (백슬래시는 여전히 REGEXP가 이스케이프 시퀀스로 해석해요.)

SELECT v, v REGEXP $$.*\s\\.*$$ AS MATCHES
  FROM strings
  ORDER BY v;

+-------------------------------------+---------+
| V                                   | MATCHES |
|-------------------------------------+---------|
| Contains embedded single \backslash | True    |
| Sacramento                          | False   |
| San Francisco                       | False   |
| San Jose                            | False   |
| Santa Clara                         | False   |
+-------------------------------------+---------+

더 알아보기