적용 대상:
Databricks SQL
Databricks Runtime
정규식(regex)은 문자열 집합을 설명하는 패턴입니다. 여러 Azure Databricks SQL 함수 및 연산자는 정규식을 사용하여 텍스트를 일치, 찾기, 개수, 추출, 바꾸기 또는 분할합니다.
- rlike 연산자 및 regexp 연산자: 문자열이 패턴과 일치하는지 테스트합니다.
- regexp_like 함수: 문자열이 패턴과 일치하는지 테스트합니다.
- regexp_count 함수: 패턴이 일치하는 횟수를 계산합니다.
- regexp_instr 함수: 첫 번째 일치 항목의 위치를 반환합니다.
- regexp_substr 함수: 일치하는 첫 번째 부분 문자열을 반환합니다.
- regexp_extract 및 regexp_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} |
사이 n 및 m 시간. |
그룹 및 변경
| 건설하다 | 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 |