regex 함수

regex 함수

regex 함수는 문자열에 정규 표현식을 적용해서 일치하는 부분 문자열을 돌려줘요. 반환 타입은 패턴의 캡처 그룹에 따라 달라져요: 캡처 그룹이 없으면 단일 문자열, 이름 없는 캡처 그룹이 있으면 리스트, 이름 있는 캡처 그룹이 있으면 맵을 돌려줘요. Terraform은 RE2 정규 표현식 언어를 사용해요.

출처: 문서

본문

regex는 문자열에 정규 표현식을 적용해서 일치하는 부분 문자열을 돌려줘요.

regex(pattern, string)

regex의 반환 타입은 패턴에 있는 캡처 그룹에 따라 달라져요:

  • 패턴에 캡처 그룹이 전혀 없으면 결과는 패턴이 전체로서 일치하는 부분 문자열을 다루는 단일 문자열이에요.
  • 패턴에 이름 없는 캡처 그룹이 하나 이상 있으면 결과는 캡처 그룹 정의 순서와 같은 순서로 된 캡처된 부분 문자열의 리스트예요.
  • 패턴에 이름 있는 캡처 그룹이 하나 이상 있으면 결과는 캡처 그룹 이름을 맵 키로 사용하는 캡처된 부분 문자열의 맵이에요.

같은 패턴에 이름 있는 캡처 그룹과 이름 없는 캡처 그룹을 섞는 것은 유효하지 않아요. 주어진 패턴이 전혀 일치하지 않으면 regex는 오류를 발생시켜요. 주어진 패턴이 문자열과 일치하는지 테스트하려면 regexall을 사용하고 결과 길이가 0보다 큰지 확인해요.

패턴은 리터럴 문자와 아래 표에 설명된 특수 일치 연산자의 혼합을 담은 문자열이에요. Terraform 언어에서 정규 표현식 패턴을 리터럴 따옴표 문자열로 줄 때, 따옴표 문자열 자체는 이미 백슬래시 \를 문자열의 이스케이프 문자로 사용하므로, 패턴의 일부로 인식되도록 의도된 백슬래시는 \\로 이스케이프해야 해요.

| | Sequence | Matches | | . | 줄바꿈을 제외한 모든 문자 | | [xyz] | 대괄호 사이에 나열된 문자 중 하나 (x, y, z) | | [a-z] | az 사이(포함)의 문자 | | [^xyz] | [xyz]의 반대 | | \d | ASCII 숫자 (09, 포함) | | \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 문자 클래스 (이 예에서 "Greek") | |\PN|\pN의 반대 | | \P{Greek}|\p{Greek}의 반대 | | xy| 바로 뒤에y가 오는 x| |x|y|x또는y, x선호 | |x*| 0개 이상의x, 더 많이 선호 | | x*?| 0개 이상의x, 더 적게 선호 | | x+| 1개 이상의x, 더 많이 선호 | | x+?| 1개 이상의x, 더 적게 선호 | | x?| 0개 또는 1개의x, 1개 선호 | | x??| 0개 또는 1개의x, 0개 선호 | | x{n,m}|xn~m반복, 더 많이 선호 | |x{n,m}?|xn~m반복, 더 적게 선호 | |x{n,}|x의 최소 n반복, 더 많이 선호 | |x{n,}?|x의 최소 n반복, 더 적게 선호 | |x{n}|x의 정확히 n반복 | |(x)| 하위 패턴x에 대한 이름 없는 캡처 그룹 | | (?Px)| 하위 패턴x에 대한, 이름이 name인 이름 있는 캡처 그룹 | | (?:x)| 캡처하지 않는 하위 패턴x| |*| 모든 구두점 문자에 대한 리터럴 . 예를 들어 .는 리터럴 .| |\Q...\E|\E를 문자 그대로 포함하지 않는 한 모든 텍스트 ...에 대한 리터럴 ...` |

위의 일치 연산자들은 일치하는 문자를 소비(consume)하는데, 그 외에도 일치하지만 문자를 소비하지 않는 연산자도 있어요. 이것들은 "제로 폭" 일치 연산자예요:

| | Sequence | Matches | | ^ | 주어진 문자열의 시작 | | $ | 주어진 문자열의 끝 | | \A | 주어진 문자열의 시작 | | \z | 주어진 문자열의 끝 | | \b | ASCII 단어 경계 (\w\W, \A, \z 사이 또는 그 반대의 전환) | | \B | ASCII 단어 경계가 아님 |

Terraform은 RE2 정규 표현식 언어를 사용해요. 이 엔진은 일부 다른 정규 표현식 엔진에 있는 모든 기능을 지원하지는 않아요. 특히 역참조(backreferences)를 지원하지 않아요.

Matching Flags (일치 플래그)

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

사용 가능한 플래그는 아래 표에 나열돼요:

| | Flag | Meaning | | i | 대소문자 구분 없음: 패턴의 리터럴 문자가 그 문자의 소문자와 대문자 버전 모두와 일치 | | m | ^$ 연산자가 문자열 안의 줄바꿈 문자로 표시된 줄의 시작과 끝도 일치. \A\z의 동작은 변하지 않음 | | s | . 연산자가 줄바꿈도 일치 | | U | 반복 연산자 뒤의 ?의 유무 의미가 반전. 예를 들어 x*x*?처럼, 그 반대도 마찬가지로 해석 |

예시

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

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

> regex("^(?:(?P<scheme>[^:/?#]+):)?(?://(?P<authority>[^/?#]*))?", "https://terraform.io/docs/")
{
  "authority" = "terraform.io"
  "scheme" = "https"
}

> 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와 같은 정규 표현식 문법으로 일치시켜요.

Terraform이 일치시키려는 문법을 파싱할 더 전문화된 함수를 이미 갖고 있다면 그 함수를 사용하는 것을 선호해요. 정규 표현식은 읽기 어렵고 의도를 흐릴 수 있어 구성을 읽고 이해하기 더 어렵게 만들 수 있어요.

더 알아보기 (Learn more)