정규 표현식

적용 대상:확인 표시 '예' Databricks SQL 확인 표시 '예' Databricks Runtime

정규식(regex)은 문자열 집합을 설명하는 패턴입니다. 여러 Azure Databricks SQL 함수 및 연산자는 정규식을 사용하여 텍스트를 일치, 찾기, 개수, 추출, 바꾸기 또는 분할합니다.

  • rlike 연산자 및 regexp 연산자: 문자열이 패턴과 일치하는지 테스트합니다.
  • regexp_like 함수: 문자열이 패턴과 일치하는지 테스트합니다.
  • regexp_count 함수: 패턴이 일치하는 횟수를 계산합니다.
  • regexp_instr 함수: 첫 번째 일치 항목의 위치를 반환합니다.
  • regexp_substr 함수: 일치하는 첫 번째 부분 문자열을 반환합니다.
  • regexp_extractregexp_extract_all 함수: 첫 번째 일치 항목 또는 모든 일치 항목에서 캡처 그룹을 반환합니다.
  • regexp_replace 함수: 일치 항목을 대체 문자열로 대체합니다.
  • split 함수: 패턴과 일치하는 문자열을 분할합니다.

유사 연산자와 ilike 연산자는 정규식을 사용하지 않습니다. 다음을 기반으로 하는 더 간단한 패턴 언어를 _%사용합니다.

Regex 엔진

Azure Databricks Java java.util.regex 엔진을 사용하여 정규식을 평가합니다. 패턴은 Perl 스타일 정규식과 광범위하게 호환되지만 일부 세부 정보는 다른 Java 정규식 구문을 따라야 합니다. 완전하고 신뢰할 수 있는 참조는 Java Pattern 클래스 설명서를 참조하세요.

다음 섹션에서는 가장 일반적으로 사용되는 구문에 대해 설명합니다.

문자 클래스

건설하다 검색 결과
. 줄 종결자를 제외한 모든 단일 문자(플래그가 s 설정되지 않은 경우).
[abc] 나열된 문자 중 하나( a, b또는 c.
[^abc] 그렇지 않은a 모든 단일 문자 또는 bc.
[a-z] 범위 az내의 모든 문자 수입니다.
\d, \D 숫자([0-9]); \D 는 숫자가 아닌 숫자와 일치합니다.
\w, \W 단어 문자([a-zA-Z_0-9]); \W 는 단어가 아닌 문자와 일치합니다.
\s, \S 공백 문자; \S 는 공백이 아닌 문자와 일치합니다.

앵커 및 경계

건설하다 검색 결과
^ 입력의 시작(또는 플래그가 있는 m 줄)입니다.
$ 입력의 끝(또는 플래그가 있는 m 줄)입니다.
\b, \B 단어 경계; \B 는 단어가 아닌 경계와 일치합니다.

수량자

수량자는 이전 요소가 일치해야 하는 횟수를 지정합니다. 기본적으로 수량자는 탐욕 스럽고 가능한 한 많이 일치합니다. 예를 들어 .*?수량자를 마지 못해(가능한 한 적게 일치)하도록 추가 ? 합니다.

건설하다 앞의 요소와 일치...
* 0회 이상 반복.
+ 한 번 이상.
? 0번 또는 1번.
{n} 정확히 n 시간.
{n,} 적어도 n 몇 번.
{n,m} 사이 nm 시간.

그룹 및 변경

건설하다 Description
(...) 캡처링 그룹입니다. regexp_extract 그룹 인덱스 사용
(?:...) 캡처하지 않는 그룹입니다. 일치 항목을 캡처하지 않고 그룹화합니다.
a\|b 교체. 일치하거나 ab입니다.

인라인 플래그

패턴의 시작 부분에 플래그를 배치하여 전체 패턴이 일치하는 방식을 변경합니다.

Flag Effect
(?i) 대/소문자를 구분하지 않는 일치
(?s) Dotall 모드입니다. . 는 줄 종결자와 일치합니다.
(?m) 여러 줄 모드입니다. ^$ 바꿈 시 일치합니다.
(?x) 주석 모드입니다. 패턴에서 이스케이프되지 않은 공백을 무시합니다.

예를 들어 (?i)ste(v\|ph)en 대/ stevenSTEPHEN 소문자와 관계없이 일치Steven합니다.

이스케이프 및 문자열 리터럴

regex 메타 문자(예: ., *, [(또는\)인 문자를 일치하려면 백슬래시 앞에 섰습니다. 예를 들어 \. 리터럴 마침표와 일치하고 \\ 리터럴 백슬래시를 일치합니다.

백슬래시는 일반 SQL 문자열 리터럴의 이스케이프 문자이기도 하므로 regex 엔진에 전달하려는 각 백슬래시를 두 배로 만들어야 합니다. 예를 들어 패턴을 \d+ 함수에 전달하려면 일반 문자열 리터럴로 작성합니다 '\\d+' .

이 이중 이스케이프를 방지하려면 이스케이프 문자 전처리를 사용하지 않도록 설정하는 (r접두사)를 사용합니다raw-literal. 원시 리터럴에서 regex 엔진에서 예상한 대로 패턴을 정확하게 작성합니다.

-- Regular string literal: backslashes must be doubled.
> SELECT regexp_substr('item 42 in stock', '\\d+');
 42

-- Raw literal: write the pattern as-is.
> SELECT regexp_substr('item 42 in stock', r'\d+');
 42

일반적인 패턴

다음 패턴은 자주 수행하는 작업을 다룹니다. 백슬라이시가 변경되지 않고 regex 엔진으로 전달되도록 원시 리터럴 로 작성됩니다. 이메일, URL 및 IP 패턴은 엄격한 유효성 검사기가 아니라 의도적으로 간단한 그림입니다.

목표 Pattern
정수( 선택적으로 서명됨) r'-?\d+'
10진수 r'-?\d+(\.\d+)?'
단어 r'\w+'
전체 단어 cat r'\bcat\b'
전자 메일 주소(단순) r'[\w.%+-]+@[\w.-]+\.\w{2,}'
URL의 호스트 r'https?://([^/]+)'
IPv4 주소(0~255를 확인하지 않음) r'\d{1,3}(\.\d{1,3}){3}'
ISO 날짜(YYYY-MM-DD) r'\d{4}-\d{2}-\d{2}'
선행 또는 후행 공백 r'^\s+\|\s+$'
미국 전화 번호(단순) r'\d{3}-\d{3}-\d{4}'

Word 경계(\b)는 부분 문자열이 아닌 전체 word 일치합니다.

-- 'cat' as a standalone word
> SELECT 'the cat sat on the mat' rlike r'\bcat\b';
 true

-- 'cat' only as part of a larger word
> SELECT 'category' rlike r'\bcat\b';
 false

리터럴 접두사를 수량자로 결합하여 주문 ID와 같은 구조화된 토큰을 추출합니다.

> SELECT regexp_substr('Ref: ORD-12345 shipped on 2024-03-15', r'ORD-\d+');
 ORD-12345

올바른 함수 선택

이 표를 사용하여 목표와 일치하는 함수를 선택합니다.

원하는 작업... 사용하세요
문자열이 일치하는지 테스트합니다. rlike / Regexp / regexp_like
일치하는 첫 번째 부분 문자열을 반환합니다. regexp_substr
캡처 그룹을 반환합니다. regexp_extract (정규 표현식 추출)
모든 일치 항목을 반환합니다. regexp_extract_all
일치 항목의 위치를 반환합니다. regexp_instr
일치 항목 수를 계산합니다. regexp_count
일치 항목을 다른 텍스트로 대체합니다. regexp_replace
일치 항목 주위에 문자열을 분할합니다. split
간단한 _ / % 패턴과 일치합니다. 처럼 / Ilike