정규 표현식 함수
정규 표현식 함수 (Regular expression functions)
정규 표현식으로 문자열을 검색·추출·치환·분할하는 함수들이에요. Java 패턴 문법을 사용해요.
출처: 문서
본문
모든 정규 표현식 함수는 Java 패턴 문법을 사용해요. 단, 몇 가지 주목할 만한 예외가 있어요.
-
멀티라인 모드(
(?m)플래그로 활성화)를 쓸 때는\n만 줄 종료자로 인식해요. 또한(?d)플래그는 지원하지 않으니 쓰면 안 돼요. -
대소문자 무시 매칭(
(?i)플래그로 활성화)은 항상 유니코드를 인식하는 방식으로 수행돼요. 하지만 컨텍스트 민감·로케일 민감 매칭은 지원하지 않아요. 또한(?u)플래그는 지원하지 않으니 쓰면 안 돼요. -
서러게이트 페어(surrogate pair)는 지원하지 않아요. 예를 들어
\uD800\uDC00은U+10000으로 취급되지 않으므로\x{10000}으로 지정해야 해요. -
기준 문자(base character)가 없는 비간격 부호(non-spacing mark)의 경우 경계(
\b)가 잘못 처리돼요. -
\Q와\E는 문자 클래스(예:[A-Z123]) 안에서 지원하지 않고, 대신 리터럴로 취급돼요. -
유니코드 문자 클래스(
\p{prop})는 다음 차이점과 함께 지원돼요.- 이름의 모든 밑줄을 제거해야 해요. 예를 들어
Old_Italic대신OldItalic을 사용해요. - 스크립트(scripts)는
Is,script=,sc=접두사 없이 직접 지정해야 해요. 예:\p{Hiragana} - 블록(blocks)은
In접두사로 지정해야 해요.block=과blk=접두사는 지원하지 않아요. 예:\p{Mongolian} - 카테고리(categories)는
Is,general_category=,gc=접두사 없이 직접 지정해야 해요. 예:\p{L} - 이진 속성(binary properties)은
Is없이 직접 지정해야 해요. 예:\p{NoncharacterCodePoint}
- 이름의 모든 밑줄을 제거해야 해요. 예를 들어
regexp_count(string, pattern) → bigint
string에서 pattern의 발생 횟수를 반환해요.
SELECT regexp_count('1a 2b 14m', '\s*[a-z]+\s*'); -- 3
regexp_extract_all(string, pattern)
string에서 정규 표현식 pattern과 일치하는 부분 문자열(들)을 반환해요.
SELECT regexp_extract_all('1a 2b 14m', '\d+'); -- [1, 2, 14]
regexp_extract_all(string, pattern, group)
string에서 정규 표현식 pattern의 모든 발생을 찾고 캡처 그룹 번호 group을 반환해요.
SELECT regexp_extract_all('1a 2b 14m', '(\d+)([a-z]+)', 2); -- ['a', 'b', 'm']
regexp_extract(string, pattern) → varchar
string에서 정규 표현식 pattern과 일치하는 첫 번째 부분 문자열을 반환해요.
SELECT regexp_extract('1a 2b 14m', '\d+'); -- 1
regexp_extract(string, pattern, group) → varchar
string에서 정규 표현식 pattern의 첫 번째 발생을 찾고 캡처 그룹 번호 group을 반환해요.
SELECT regexp_extract('1a 2b 14m', '(\d+)([a-z]+)', 2); -- 'a'
regexp_like(string, pattern) → boolean
정규 표현식 pattern을 평가하고 string 안에 포함되는지 판별해요.
pattern은 string 전체와 일치할 필요 없이 string 안에 포함되기만 하면 돼요. 즉 match 연산이 아니라 contains 연산을 수행해요. ^, $로 패턴을 고정하면 전체 문자열을 매칭할 수 있어요.
SELECT regexp_like('1a 2b 14m', '\d+b'); -- true
regexp_position(string, pattern) → integer
string에서 pattern의 첫 발생 인덱스(1부터 시작)를 반환해요. 찾지 못하면 -1을 반환해요.
SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b'); -- 8
regexp_position(string, pattern, start) → integer
start(포함)부터 시작해 string에서 pattern의 첫 발생 인덱스를 반환해요. 찾지 못하면 -1을 반환해요.
SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b', 5); -- 8
SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b', 12); -- 19
regexp_position(string, pattern, start, occurrence) → integer
start(포함)부터 시작해 string에서 pattern의 n번째 occurrence 인덱스를 반환해요. 찾지 못하면 -1을 반환해요.
SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b', 12, 1); -- 19
SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b', 12, 2); -- 31
SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b', 12, 3); -- -1
regexp_replace(string, pattern) → varchar
string에서 정규 표현식 pattern과 일치하는 부분 문자열의 모든 인스턴스를 제거해요.
SELECT regexp_replace('1a 2b 14m', '\d+[ab] '); -- '14m'
regexp_replace(string, pattern, replacement) → varchar
string에서 정규 표현식 pattern과 일치하는 부분 문자열의 모든 인스턴스를 replacement로 치환해요. 캡처 그룹은 replacement에서 번호 그룹은 $g로, 이름 그룹은 ${name}으로 참조할 수 있어요. 달러 기호($)는 백슬래시(\$)로 이스케이프하면 포함할 수 있어요.
SELECT regexp_replace('1a 2b 14m', '(\d+)([ab]) ', '3c$2 '); -- '3ca 3cb 14m'
regexp_replace(string, pattern, function) → varchar
string에서 정규 표현식 pattern과 일치하는 부분 문자열의 모든 인스턴스를 function을 사용해 치환해요. 람다 표현식 function은 각 매치마다 호출되며 캡처 그룹이 배열로 전달돼요. 캡처 그룹 번호는 1부터 시작하고, 전체 매치에 대한 그룹은 없어요(필요하면 전체 표현식을 괄호로 감싸세요).
SELECT regexp_replace('new york', '(\w)(\w*)', x -> upper(x[1]) || lower(x[2])); --'New York'
regexp_split(string, pattern)
정규 표현식 pattern으로 string을 분할하고 배열을 반환해요. 끝의 빈 문자열은 보존돼요.
SELECT regexp_split('1a 2b 14m', '\s*[a-z]+\s*'); -- [1, 2, 14, ]
더 알아보기 (Learn more)
정규 표현식의 패턴 문법 세부 사항은 자바 Pattern 문서를 참고해 보세요. 문자열 처리 함수는 문자열 함수 문서에서 확인할 수 있어요.