정규 표현식 함수

정규 표현식 함수 (Regular expression functions)

정규 표현식으로 문자열을 검색·추출·치환·분할하는 함수들이에요. Java 패턴 문법을 사용해요.

출처: 문서

본문

모든 정규 표현식 함수는 Java 패턴 문법을 사용해요. 단, 몇 가지 주목할 만한 예외가 있어요.

  • 멀티라인 모드((?m) 플래그로 활성화)를 쓸 때는 \n만 줄 종료자로 인식해요. 또한 (?d) 플래그는 지원하지 않으니 쓰면 안 돼요.

  • 대소문자 무시 매칭((?i) 플래그로 활성화)은 항상 유니코드를 인식하는 방식으로 수행돼요. 하지만 컨텍스트 민감·로케일 민감 매칭은 지원하지 않아요. 또한 (?u) 플래그는 지원하지 않으니 쓰면 안 돼요.

  • 서러게이트 페어(surrogate pair)는 지원하지 않아요. 예를 들어 \uD800\uDC00U+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 안에 포함되는지 판별해요.

patternstring 전체와 일치할 필요 없이 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 문서를 참고해 보세요. 문자열 처리 함수는 문자열 함수 문서에서 확인할 수 있어요.