1. 개요

링크

이번글의 특징

2. re2 wiki

WhyRE2

  • Safety is RE2’s raison d’être.
  • 문단 1
    • RE2는 다음과 같은 명확한 목표하에 설계되고 구현되었습니다.
      • 인증받지않은 사용자의 정규식 입력을 리스크없이 다룰수 있도록 하겠다
    • 주요 보장중의 하나는 다음과 같습니다
      • 일치 검색 시간이 입력 문자열의 길이와 선형적으로 비례한다는 겁니다
    • 또한 생산적인 측면 또한 고려되어 작성되었습니다
      • 파서, 컴파일러, 실행 엔진은 configurable budget내에서 작동하여 메모리 사용량을 제한합니다
        • 즉, 메모리가 고갈되면 우아하게 에러를 처리합니다
      • 그리고 재귀를 피해 스택 오버플로우를 방지합니다
  • 문단 2
    • 모든 환경에서 모든 다른 엔진보다 속도가 빠르고자 하는 것이 목표가 아닙니다
    • RE2는 선형 시간 성능을 보장하지만,
      • 선형 시간 상수는 정규식의 안전한 처리에 수반되는 오버헤드에 따라 달라집니다.
      • 어떤 의미에서는, backtracking 엔진이 낙관적으로 동작하는 반면에 RE2는 비관적으로 동작합니다
        • 따라서 다양한 상황에서 예상되는 성능을 능가할 수 있습니다
  • 문단 3
    • Perl, PCRE 와 다른 엔진이 제공하는 모든 기능을 지원하는 것 또한 목표가 아닙니다
    • 원칙적으로, RE2는 backtracking 솔루션만 존재하는 것으로 알려진 구조를 지원하지 않습니다
    • 따라서, backreferences와 주변보기 assertions이 지원되지 않습니다
  • 자세한 내용은 정규 표현식 이론 및 실습에 대한 Russ Cox의 기사를 참조하세요

Syntax

  • 정규 표현식은 문자열 세트(character strings)를 설명하기 위한 표기법(notations)입니다
  • 특정한 문자열이 정규 표현식으로 표현된 문자집합을 가질 때,
    • 정규 표현식이 문자열과 match되었다고 말합니다
  • 가장 간단한 정규식은 단일 리터럴 문자입니다
    • *+?()|과 같은 메타 문자를 제외하고 문자는 자신과 match됩니다
    • 메타 문자와 match하려면, backslash로 escape합니다
      • 즉, \+는 literal 플러스 문자와 match됩니다
  • 두 개의 정규 표현식은 서로 대체 되거나 연결하여 새로운 정규표현식을 구성할 수 있습니다
    • 즉, $e_1$가 $s$에 match하고 $e_2$가 $t$와 match한다면..
      • $e_1$|$e_2$도 $s$나 $t$에 match하고 $e_1e_2$도 $st$에 match한다
  • 메타문자 *,+,?는 반복 연산자입니다:
    • $e_1$*는 0개 이상의 (아마도 다른)strings의 sequence와 match됩니다
      • 위에서 각각의 string은 표현식 $e_1$과 match됩니다
    • $e_1$+는 1개 이상과 match되며
    • $e_1$?는 0 혹은 1개와 match됩니다
  • 약한 binding부터 강한 binding 순서로 연산자 우선순위는..
    • 첫번째가 교대(alternation, |), 그 다음이 연결(concatenation) 마지막이 반복(repetition) 연산자입니다
    • 명시적 괄호(Explicit parentheses)는 이 우선순위에 예외를 줄 수 있습니다.
      • 수학 표현식에서와 마찬가지로요
      • 예를 들자면
        • ab|cd(ab)|(cd)와 같습니다. - b|c의 alternation 이 ab의 concatenation보다 약함
        • ab*a(b*)와 같습니다. - ab 의 concatenation 보다 b* 의 반복(repetion) 이 강함
  • 지금까지 설명한 내용은 Unix egrep 정규 표현식의 문법의 대부분입니다.
    • 이 부분집합(subset)은 모든 정규식 언어을 묘사하는데 충분합니다
    • 느슨하게 말하면, 정규식 언어(regular language)는 …
      • text를 고정된 크기의 메모리를 사용하여 한번 통과하여 일치시킬수 있는 ..
      • 문자열 집합입니다.
    • 최신의 정규 표현식 기능(특히 Perl과 그 복제품들)은 ..
      • 많은 신규 연산자와 escape squence를 추가했는데..
      • 이들은 정규식을 간결하게 만들기도 하지만..
      • 가끔은 좀더 혼동을주며, 보다 강력한것 같지도 않습니다.
  • 이 페이지는 RE2에서 허용된 정규 표현식 문법의 목록입니다
  • PCRE, PERL, VIM에서 허용된 일부 문법 또한 포함됩니다

단일 문자 표현식의 종류

단일 문자 표현식의 종류 예제
모든 문자, 개행문자 포함(s=true) .
문자 클래스 [xyz]
문자 이외 클래스 [^xyz]
Perl 문자 클래스 (link) \d
Perl 문자 이외 클래스 \D
ASCII 문자 클래스 [[:alpha:]]
ASCII 문자 이외 클래스(link) [[:^alpha:]]
Unicode 문자 class (한 글자 이름) \pN
Unicode 문자 class \p{Greek}
Unicode 문자 이외 클래스 (한 글자 이름) \PN
Unicode 문자 이외 클래스 \P{Greek}

Composites

  합성문자
xy x 다음에 오는 y
x│y x 아니면 y (x 우선 )

Repetitions

  반복문자
x* 0개 이상의 x, 많은쪽 선호
x+ 1개 이상의 x, 많은쪽 선호
x? 0개 혹은 1개의 x, 1개를 선호
x{n,m} n 이나 n+1 이나 … 이나 m개의 x, 많은쪽 선호
x{n,} n개의 이상의 x, 많은쪽 선호
x{n} 정확히 n개의 x
x*? 0개 이상의 x, 적은쪽 선호
x+? 1개 이상의 x, 적은쪽 선호
x?? 0개 혹은 1개의 x, 0개를 선호
x{n,m}? n 이나 n+1 이나 … 이나 m개의 x, 적은쪽 선호
x{n,}? n개의 이상의 x, 적은쪽 선호
x{n}? 정확히 n개의 x
x{} (≡x*) (지원 안됨) VIM
x{-} (≡x*?) (지원 안됨) VIM
x{-n} (≡x{n}?) (지원 안됨) VIM
x= (≡x?) (지원 안됨) VIM
  • 구현 제한
    • 카운팅 형식인 x{n,m}, x{n,}, x{n}은 최소또는 최대 반복횟수가 1000이 넘는 형식을 거부합니다
    • 무제한 반복은 이 제한이 적용되지 않습니다

Possessive repetitions

  • Possessive 용어
  • Possessive 의 특징
    • backtrack을 하지 않는다
      • 맞지 않으면 바로 끝남 ( The deal is all or nothing. )
  독점적 반복자
x*+ 0개 이상의 x, 독점적 (지원 안됨)
x++ 1개 이상의 x, 독점적 (지원 안됨)
x?+ 0개 혹은 1개의 x, 독점적 (지원 안됨)
x{n,m}+ n 이나 n+1 이나 … 이나 m개의 x, 독점적 (지원 안됨)
x{n,}+ n개의 이상의 x, 독점적 (지원 안됨)

ASCII 문자 클래스

  ASCII 문자 클래스
[[:alnum:]] alphanumeric (≡ [0-9A-Za-z])
[[:alpha:]] alphabetic (≡ [A-Za-z])

Grouping

  • 아래 표에서 reregular expression 인듯 하다
  • 캡쳐 : 어딘가에 잡아(캡쳐)둠. 다른곳에 써먹기 위해..
  • Non-Capturing Group , stackoverflow 답변
    • URL을 regex 파싱할 때 프로토콜인 http or https 부분은 파싱할 때는 필요하지만 match된 이후 별 쓸모가 없다
    • 나중에 써먹을 필요가 없는 부분은 잡아둘(캡처할) 필요가 없으므로 Non-Captureing Group으로 설정하곤 한다
  그루핑
(re) 번호가 매겨진 캡쳐 그룹 (submatch)
(?P<name>re) 이름과 번호가 설정된 캡쳐 그룹 (submatch)
(?<name>re) 이름과 번호가 설정된 캡쳐 그룹 (submatch) (지원 안됨)
(?'name're) 이름과 번호가 설정된 캡쳐 그룹 (submatch) (지원 안됨)
(?:re) 캡쳐 안하는 그룹
(?flags) 현재 그룹내에 플래그를 설정; 캡쳐 안하는 그룹
(?#text) 주석 (지원 안됨)
(?│x│y│z) 브랜치 숫자 리셋 (지원 안됨)
(?>re) re의 독점적 match (지원 안됨)
re@> re의 독점적 match (지원 안됨) VIM
%(re) 캡쳐 안하는 그룹 (지원 안됨) VIM

Flags

  플래그
i 매치할 때 case를 신경쓰지 않음 ( 기본값은 false )
m 다중 라인 모드: ^$가 text의 처음과 끝뿐만 아니라
line의 처음과 끝과 match됨 (기본값은 false)
s .가 개행문자 \n 까지도 match됨 ( 기본값은 false )
U ungreedy: x*x*?의 의미를 x*?, x+?로 swap함 ( 기본값은 false )
  • Flag 문법은 xyz(설정) -xyz (해제) , 혹은 xy-z ( xy는 설정 z는 해제)

Empty strings

  공백 문자열
^ line(m이 true일때) 이나 text의 시작
$ line(m이 true일때) 이나 text의 끝 (\Z이 아니고 \z과 같음)
\A text의 시작
\b ASCII 단어의 경계 (한 쪽은 \w이고 다른한 쪽은 \W, \A 혹은 \z가 됨
\B ASCII 단어의 경계에 있지 않을때
\g 찾는 sbutext의 시작 (지원 안됨) PCRE
\G 마지막 match의 끝 (지원 안됨) PERL
\Z text의 끝이거나, text의 끝에서 새 줄이 시작하기 전 (지원 안됨)
\z text의 끝
(?=re) re에 match되는 text 바로 전 (지원 안됨)
(?!re) re에 match되지 않는 text 바로 전 (지원 안됨)
(?<=re) re에 match되는 text 이후 (지원 안됨)
(?<!re) re에 match되지 않는 text 이후 (지원 안됨)
re& re에 match되는 text 이전 (지원 안됨) VIM
re@= re에 match되는 text 이전 (지원 안됨) VIM
re@! re에 match되지않는 text 이전 (지원 안됨) VIM
re@<= re에 match되는 text 이후 (지원 안됨) VIM
re@<! re에 match되지않는 text 이후 (지원 안됨) VIM
\zs match 시작의 sets (= \K) (지원 안됨) VIM
\ze match 끝의 sets (지원 안됨) VIM
\%^ file의 시작 (지원 안됨) VIM
\%$ file의 끝 (지원 안됨) VIM
\%V screen 상에서 (지원 안됨) VIM
\%# cursor 위치에서 (지원 안됨) VIM
\%'m mark m 위치에서 (지원 안됨) VIM (링크는 표 아랫쪽 참조)
\%23l line 23 위치에서 (지원 안됨) VIM
\%23c column 23 위치에서 (지원 안됨) VIM
\%23v virtual column 23 위치에서 (지원 안됨) VIM

\%'m 링크는 이 곳을 참조하세요. 테이블내에서 링크 안됨

Escape sequences

  이스케이프 시퀀스
\a bell (≡╲007)
\f form feed (≡╲014)
\t horizontal tab (≡╲011)
  • 안쓸것 같아 대부분 생략

Perl 문자 클래스

  Perl 문자 클래스 ( all ASCII-only)
\d 숫자 (≡ [0-9])
\D 숫자아닌 문자 (≡ [^0-9])
\s 공백 문자 (≡ [\t\n\f\r ])
\S 공백아닌 문자 (≡ [^\t\n\f\r ])
\w 일반단어 문자 (≡ [0-9A-Za-z_])
\W 일반단어아닌 문자 (≡ [^0-9A-Za-z_])
   
   
   

ASCII 문자 클래스

  • 편집시 팁: 연속된 [[ 앞에 를 붙여서 링크를 만들지 않도록 한다
  ASCII 문자 클래스
\[[:alnum:]] 알파누메릭 (≡ [0-9A-Za-z])
\[[:alpha:]] 알파베틱 (≡ [A-Za-z])
\[[:ascii:]] ASCII (≡ [\x00-\x7F])
\[[:blank:]] 빈칸문자 (≡ [\t ])
\[[:cntrl:]] control (≡ [\x00-\x1F\x7F])
\[[:digit:]] 숫자 (≡ [0-9])
\[[:graph:]] graphical (≡ [!-~][A-Za-z0-9!"#$%&'()*+,\-./:;<=>?@[\\\]^_{|}~])
\[[:lower:]] 소문자 (≡ [a-z])
\[[:print:]] 프린트되는 문자 (≡ [ -~][ [:graph:]])
\[[:punct:]] 구두점 (≡ [!-/:-@[- ' {-~])
\[[:space:]] 공백문자 (≡ [\t\n\v\f\r ])
\[[:upeer:]] 대문자 (≡ [A-Z])
\[[:word:]] 단어문자 (≡ [0-9A-Za-z_])
\[[:xdigit:]] 16진수 (≡ [0-9A-Fa-f])

Unicode character class names–general category

  • 어떻게 사용하는지 모르겠어서 생략

Unicode character class names–scripts

  • 어떻게 사용하는지 모르겠어서 생략

Vim character classes

  • 대부분이 Not Supported라 생략
  • Not supported가 아닌것은 앞에 나왔음

Magic

  • 일단 생략