regex 함수

regex 함수

regex는 정규 표현식(regular expression)을 문자열에 적용하고 일치하는 부분 문자열을 반환해요.

출처: Packer 공식 문서

regex(pattern, string)

regex의 반환 타입은 패턴에 있는 캡처 그룹(capture groups)에 따라 달라져요.

  • 패턴에 캡처 그룹이 전혀 없으면, 결과는 패턴 전체가 일치한 부분 문자열 하나를 담은 단일 문자열이에요.
  • 패턴에 이름 없는 캡처 그룹이 하나 이상 있으면, 결과는 캡처 그룹 정의 순서와 같은 순서의 캡처된 부분 문자열 목록이에요.
  • 패턴에 이름 있는 캡처 그룹이 하나 이상 있으면, 결과는 캡처 그룹 이름을 맵 키로 사용하는 캡처된 부분 문자열 맵이에요.

같은 패턴에서 이름 있는 캡처 그룹과 이름 없는 캡처 그룹을 섞는 것은 유효하지 않아요.

주어진 패턴이 전혀 일치하지 않으면 regex는 오류를 발생시켜요. 주어진 패턴이 문자열과 일치하는지 테스트하려면 regexall을 사용해 결과 길이가 0보다 큰지 확인하세요.

패턴은 리터럴 문자와 특수 매칭 연산자가 섞인 문자열이며, 아래 표에서 설명해요. Packer 언어에서 정규 표현식 패턴을 리터럴 따옴표 문자열로 제공할 때는 따옴표 문자열 자체가 이미 문자열의 이스케이프 문자로 백슬래시 \를 사용하므로, 패턴의 일부로 인식되도록 의도된 백슬래시는 모두 \\로 이스케이프해야 해요.

시퀀스 일치 대상
. 개행을 제외한 모든 문자
[xyz] 대괄호 사이에 나열된 문자 중 하나 (이 예시에서는 x, y, z)
[a-z] a와 z 사이(포함)의 모든 문자
[^xyz] [xyz]의 반대
\d ASCII 숫자 (0부터 9까지 포함)
\D ASCII 숫자를 제외한 모든 것
\s ASCII 공백 (space, tab, newline, carriage return, form feed)
\S ASCII 공백을 제외한 모든 것
\w [0-9A-Za-z_]와 같음
\W \w가 일치하는 문자를 제외한 모든 것
[[:alnum:]] [0-9A-Za-z]와 같음
[[:alpha:]] [A-Za-z]와 같음
[[:ascii:]] 모든 ASCII 문자
[[:blank:]] ASCII tab 또는 space
[[:cntrl:]] ASCII/Unicode 제어 문자
[[:digit:]] [0-9]와 같음
[[:graph:]] 모든 "그래픽"(인쇄 가능한) ASCII 문자
[[:lower:]] [a-z]와 같음
[[:print:]] [[:graph:]]와 같음
[[:punct:]] [!-/:-@[-{-~]`와 같음
[[:space:]] [\t\n\v\f\r ]와 같음
[[:upper:]] [A-Z]와 같음
[[:word:]] \w와 같음
[[:xdigit:]] [0-9A-Fa-f]와 같음
\pN 단일 문자 클래스 이름을 사용하는 Unicode 문자 클래스 (이 예시에서는 "N")
\p{Greek} Unicode 이름으로 지정한 Unicode 문자 클래스 (이 예시에서는 "Greek")
\PN \pN의 반대
\P{Greek} \p{Greek}의 반대
xy x 바로 뒤에 오는 y
x|y x 또는 y (x 선호)
x* x 0개 이상 (더 많이 선호)
x*? x 0개 이상 (더 적게 선호)
x+ x 1개 이상 (더 많이 선호)
x+? x 1개 이상 (더 적게 선호)
x? x 0개 또는 1개 (1개 선호)
x?? x 0개 또는 1개 (0개 선호)
x{n,m} x의 n~m회 반복 (더 많이 선호)
x{n,m}? x의 n~m회 반복 (더 적게 선호)
x{n,} x의 최소 n회 반복 (더 많이 선호)
x{n,}? x의 최소 n회 반복 (더 적게 선호)
x{n} x의 정확히 n회 반복
(x) 하위 패턴 x의 이름 없는 캡처 그룹
(?P<name>x) 하위 패턴 x의 이름 있는 캡처 그룹, 이름은 name
(?:x) 캡처하지 않는 하위 패턴 x

위의 일치하는 문자를 소비하는 연산자에 더해, 매칭만 하고 문자를 소비하지 않는 추가 연산자도 있어요. 이를 "zero-width" 매칭 연산자라고 해요.

시퀀스 일치 대상
^ 주어진 문자열의 시작
$ 주어진 문자열의 끝
\A 주어진 문자열의 시작
\z 주어진 문자열의 끝
\b ASCII 단어 경계 (\w와 \W·\A·\z 중 하나 사이의 전환, 또는 그 반대)
\B ASCII 단어 경계가 아닌 곳

Packer는 RE2 정규 표현식 언어를 사용해요. 이 엔진은 다른 일부 정규 표현식 엔진에서 찾을 수 있는 모든 기능을 지원하지는 않아요. 특히 백레퍼런스(backreferences)를 지원하지 않아요.

매칭 플래그 (Matching Flags)

위에서 설명한 일부 매칭 동작은 매칭 플래그를 설정해 수정할 수 있어요. (?flags) 연산자로 현재 하위 패턴 내에서 활성화하거나, (?flags:x) 연산자로 수정된 플래그로 x를 매치할 수 있어요. 각 플래그는 단일 문자이며, flags 위치에 여러 문자를 나열해 한 번에 여러 플래그를 설정할 수 있어요.

사용 가능한 플래그는 아래 표에 나와 있어요.

플래그 의미
i 대소문자 구분 없음: 패턴의 리터럴 문자가 그 문자의 소문자와 대문자 버전 모두와 일치
m ^와 $ 연산자가 개행 문자로 표시된 문자열 안의 줄 시작·끝과도 일치; \A와 \z의 동작은 변경 없음
s . 연산자가 개행 문자와도 일치
U 반복 연산자 뒤의 ?의 존재 여부 의미가 반전됨. 예: x*는 x*?처럼, 그 반대는 반대로 해석됨

예시 (Examples)

> regex("[a-z]+", "53453453.345345aaabbbccc23454")
aaabbbccc

> regex("(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)", "2019-02-01")
[
"2019",
"02",
"01",
]

> regex("[a-z]+", "53453453.34534523454")

Error: Error in function call

Call to function "regex" failed: pattern did not match any part of the given
string.
  • regexall은 문자열에서 주어진 패턴의 잠재적으로 여러 개의 일치를 검색해요.
  • replace는 문자열의 부분 문자열을 다른 문자열로 교체하며, 선택적으로 regex와 같은 정규 표현식 문법으로 일치시킬 수 있어요.

만약 Packer가 일치시키려는 문법을 파싱하는 더 특화된 함수를 이미 갖고 있다면, 그 함수를 사용하는 것을 선호하세요. 정규 표현식은 읽기 어려울 수 있고 의도를 모호하게 만들어 설정을 읽고 이해하기 더 어렵게 만들 수 있어요.