정규표현식 (Regular Expressions)

on under tech
6 minute read

특정한 패턴에 일치하는 복잡한 문자열을 처리할 때 사용하는 기법.

파이썬에서는 표준 모듈 re 를 사용해서 사용할 수 있다.

imoort re
result = re.match('Ex', 'Expressions')

match의 첫번째 인자에는 패턴이 들어가고, 두번째 인자에는 문자열 소스가 들어간다.

match()는 소스와 패턴의 일치 여부를 확인하고, 일치할 경우 Match object를 반환한다.

Cheatsheet

Character classes

특정 셋의 문자와 일치

class expr description ex
dot . 줄 바꿈을 제외한 모든 문자와 일치
match any /s /S 줄 바꿈을 포함하여 모든 문자를 일치
word \w 모든 단어 문자 (영숫자 및 밑줄)와 일치
[A-Za-z0-9_] 와 동일
not word \W 단어 문자가 아닌 문자 (영숫자 및 밑줄)와 일치
[^ A-Za-z0-9_] 와 동일
digit \d 임의의 숫자 (0-9)와 일치
[0-9]와 동일
not digit \D 숫자가 아닌 문자와 일치
[^0-9]와 동일
whitespace \s 공백 문자(공백, 탭, 줄바꿈)와 일치
not whitespace \S 공백 문자(공백, 탭, 줄바꿈)가 아닌 문자와 일치
character set [ABC] 셋의 모든 문자와 일치
negated set [^ABC] 셋에 없는 모든 문자와 일치

Anchors

문자가 아닌 문자열 내의 위치

class expr description ex
beginning ^ multiline flag(m)가 활성화 된 경우 문자열의 시작 또는 행의 시작과 일치
문자가 아닌 위치와 일치
end $ multiline flag(m)가 활성화 된 경우 문자열의 끝 또는 행의 끝과 일치
문자가 아닌 위치와 일치
word boundary \b 공백, 구두점 또는 문자열의 시작/끝과 같은 단어 경계 위치를 찾음
문자가 아닌 위치와 일치
not word boundary \B 단어 경계다 아닌 위치와 일치
문자가 아닌 위치와 일치

Escaped characters

일부 문자는 정규 표현식에서 특별한 의미를 지니며 이스케이프해야 합니다.

class expr description ex
octal escape \000 8진수는 \000 형식의 문자를 이스케이프 처리
255(\377)보다 작아야함
hexadecimal escape \xFF \xFF 형식의 16진수 이스케이프 문자
unicode escape \uFFFF 유니코드 \uFFFF 형식의 문자를 이스케이프 처리
control character escape \cI \cZ 형식의 제어 문자를 이스케이프 처리
\cA(NULL, char code 0)에서 \cZ(EM, char code 25)까지 다양
tab \t TAB 문자(char code 9)와 일치  
line feed \n LINE FEED 문자(char code 10)와 일치  
vertical tab \v VERTICAL TAB 문자(char code 11)와 일치  
form feed \f FORM FEED 문자(char code 12)와 일치  
carrige return \r CARRIAGE RETURN 문자(char code 13)와 일치  
null \0 NULL 문자(char code 0)와 일치  

Groups & Lookaround

그룹을 사용하면 일련의 토큰을 결합하여 함께 작동할 수 있음
캡쳐 그룹은 역 참조로 참조되고 결과에서 별도로 엑서스 할 수 있음
둘러보기를 사용하면 그룹을 결과에 포함하지 않고 일치시킬 수 있음

class expr description  
capturing group (ABC) 여러 토큰을 그룹화하고 하위 문자열을 추출하거나 역참조를 사용하는 캡처드룹을 만듬
backreference \1 이전 캡쳐 그룹의 결과와 일치
예를 들어 \1 은 첫번째, \3은 세번째 캡쳐 그룹과 일치
non-capturing group (?:ABC) 캡쳐 그룹을 만들지 않고 여러 토큰을 그룹화 함
positive lookahead (?=ABC) 그룹을 주 표현식 다음에 일치시키지 않고 결과에 포함
negative looahead (?!ABC) 주 표현식 뒤에 일치 할 수 없는 그룹을 지정
(일치하는 경우 결과가 무시)
positive lookahead* (?<=ABC) 결과에 포함시키지 않고 주 표현식 앞에 그룹을 일치
JavaScript는 지원 안됨
 
negative lookahead* (?<!ABC) 주 표현식 앞에 일치시킬 수 없는 그룹을 지정
(일치하는 경우 결과가 무시)
JavaScript는 지원 안됨
 

Quantifiers & Alternation

Quantifiers는 선행하는 토큰이 일정 횟수 일치해야 함
기본적으로 최대한 많은 문자와 일치
Alternation는 하나의 순서 또는 다른 것과 부합하는 boolean OR과 같은 역할을 함

class expr description ex
plus + 앞의 토큰 중 하나 이상과 일치
star * 앞의 토큰 중 0개 이상을 찾음
quantifier {1,3} 이전 토큰의 지정된 수량과 일치
{3}은 정확히 3개 일치해야함
{3,}은 3개 이상과 일치
optional ? 앞의 토큰 중 0 또는 1과 일치하므로 효과적으로 선택적으로 만듬
lazy ? 앞에 있는 한정 기호를 게으르게 만들어서 가능한한 적은 수의 문자와 일치시킴
기본적으로 한정기호는 최대한 많은 문자와 일치
alternation | boolean OR과 같은 역할을 함
|앞 뒤에 있는 표현식을 일치
그룹내에서 또는 전체 표현식에서 작동할 수 있음
패턴은 순서대로 테스트됨

Substitution

이 토큰은 대체 문자열에서 일치 항목의 다른 부분을 삽입하는데 사용

class expr description
match $& 일치하는 텍스트를 삽입
capture group $1 지정된 캡처 그룹의 결과를 삽입
(ex. $3은 세번째 캡처 그룹을 삽입)
before match $` 일치하는 원본 문자열의 일부를 삽입
after match $’ 일치하는 문자열 다음에 오는 부분을 삽입
escaped $ $$ 달러 문자($)를 삽입
escaped characters \n 대체 문자열에는 \n, \t, \x09, \u0009 와 같은 JS 문자열 형식과 호환되는 이스케이프 된 문자가 지원됨

Flags

표현식 플래그는 표현식 해석 방법을 변경함
JS에는 세 개의 플래그가 있음.

class|expr|description —|—|— ignore case|i|전체 표현식을 대소 문자를 구별하지 않게 함
\aBc\i는 AbC와 일치함 global search|g|마지막 일치 항목의 색인을 유지하면 이후 검색이 이전 일치 항목의 끝에서부터 시작될 수 있음
전역 플래그가 없으면 후속 검색에서 동일한 일치 항목을 반환 multiline|m|multiline 플래그가 활성화괴면 시작 및 끝 앵커(^ 및 $)는 전체 문자열의 시작 및 끝 대신 줄의 시작 및 끝과 일치
/^[\s\S]+$/m과 같은 패턴은 앵커가 모든 라인의 시작/끝과 일치하기 때문에 여러 줄에 걸쳐있는 일치를 반환 할 수 있습니다.

Examples

integer & decimal numbers

test testing

phone numbers

word

24 or 32 bit colors

4 letter words

2-5 letter palindromes

정규식 공부하기 좋은 사이트

http://regexr.com/

https://wikidocs.net/4309

tech
comments powered by Disqus