[정규식] 핵심만 모아놓은 Cheat Sheet

정규식(Regular expressions, Regex 또는 Regexp)은 특정 검색 패턴(ASCII 또는 유니코드 문자의 시퀀스)에 대한 하나 이상의 일치 항목을 검색하여 텍스트에서 정보를 추출하는데 매우 유용합니다.

유효성 검사에서 문자열 파싱 및 대체, 데이터를 다른 형식으로 변환 및 웹 스크래핑에 이르기까지 다양한 응용분야가 있습니다.

가장 흥미로운것 중 하나는 정규식을 학습한 후에는 거의 모든 프로그래밍 언어(Javascript, Java, VB, C#, C, C++, Python, Perl, Ruby, Delphi, R, Tcl 등등)에서 동일하게 사용할 수 있다는 것입니다. 엔진이 지원하는 문법버전 이나 최신특징에 따라서 약간의 차이만 있을 뿐입니다.

자, 이제 몇가지 예제와 설명을 통해 시작하겠습니다!

Basic topics

Anchors — ^ and $

^The       The 로 시작하는 모든 문자열을 매칭합니다 -> 실습해보세요!end$       end로 끝나는 문자열과 매칭합니다^The end$  The end와 정확하게 일치하는 문자열을 매칭합니다roar       roar가 들어있는 모든 문자열과 매칭합니다

Quantifiers — *+? and {}

abc*       ab 그리고 0개 이상의 c 를 포함한 문자열과 매칭합니다 -> 실습해보세요!abc+       ab 그리고 1개 이상의 c 를 포함한 문자열과 매칭합니다abc?       ab 그리고 0개 또는 1개의 c 를 포함한 문자열과 매칭합니다 abc{2}     ab 그리고 2개의 c 를 포함한 문자열과 매칭합니다  abc{2,}    ab 그리고 2개 이상의 c 를 포함한 문자열과 매칭합니다abc{2,5}   ab 그리고 2개 이상 5개 이하의 c 를 포함한 문자열과 매칭합니다a(bc)*     a 그리고 0개 이상의 bc를 포함한 문자열과 매칭합니다a(bc){2,5} a 그리고 2개 이상 5개 이하의 bc를 포함한 문자열과 매칭합니다

OR operator — | or []

a(b|c)     a 그리고 b 또는 c를 포함한 문자열과 매칭합니다 -> 실습해보세요!a[bc]      위와 동일합니다

Character classes — \d \w \s and .

\d         숫자 하나와 매칭합니다 -> 실습해보세요!\w         문자(숫자, 영문, 언더바) 하나와 매칭합니다 -> 실습해보세요!\s         공백문자(탭, 줄바꿈, 스페이스) 하나와 매칭합니다.          모든 문자 하나와 매칭합니다 -> 실습해보세요!

클래스 또는 부정문자 클래스가 더 빠르고 정확하기 때문에 . 연산자는 조심스럽게 사용하세요.

\d, \w, \s도 각각 \D, \W, \S로 표시하면 반대의 의미로 매칭시킬수 있습니다.

예를 들어, \D\d의 매칭 값과 반대로 매칭을 수행합니다.

\D          숫자가 아닌 문자열 하나와 매칭합니다 -> 실습해보세요!

특수문자(^.[$()|*+?{\)를 문자 그대로 사용하려면, 역슬래쉬\를 앞에 붙여야합니다.

\$\d        $ 문자 그리고 숫자 하나와 매칭합니다 -> 실습해보세요!

출력이 불가능한 탭문자\t, 줄바꿈문자\n, 캐리지리턴문자\r 또한 매칭할 수 있습니다.

Flags

우리는 정규식을 만드는 방법을 배우고 있지만, 기본적인 개념인 flags를 배워야 합니다.

정규식은 보통 /abc/와 같은 형식을 사용하며, 두개의 슬래쉬 문자/ 사이에 정규식을 작성합니다. 두번째 슬래쉬 뒤에 플래그를 사용할 수 있습니다.

  • g(global) 문자열에서 첫번째 매칭 후, 끝나지 않고 매칭되는 모든 항목을 찾습니다
  • m(multi-line) anchor(^ 또는 $)가 문자열 전체가 아닌, 줄 각각에 매칭하여 줄별로 정규식 패턴을 매칭시킬 수 있습니다
  • i(insensitive) 대소문자 구분을 무시하고 매칭합니다(예를 들어, /aBc/iAbC를 매칭합니다)

Intermediate topics

Grouping and capturing — ()

a(bc)       소괄호는 캡쳐 그룹을 생성합니다 -> 실습해보세요!a(?:bc)*    ?: 는 캡쳐 그룹생성을 무시합니다 -> 실습해보세요!a(?<foo>bc) ?<foo> 는 캡쳐 그룹에 이름을 지정합니다 -> 실습해보세요!

이 연산자는 문자열로부터 정보를 추출할 때 매우 유용합니다. 여러 그룹으로 캡쳐된 결과는 배열로 반환됩니다. 따라서, index로 캡쳐된 내용을 사용할 수 있습니다.

?<foo> 형태를 사용하여 그룹에 이름을 지정하면 값을 key-value 형태를 가진 dictionary처럼 접근하여 사용할 수 있습니다.

Bracket expressions — []

[abc]       a 또는 b 또는 c 를 포함하는 문자열과 매칭합니다
-> a|b|c와 동일합니다 -> 실습해보세요!
[a-c] 위와 동일합니다[a-fA-F0-9] 16진수의 문자 하나와 매칭하고 대소문자를 구분하지 않습니다 ->실습해보세요![0-9]% 0이상 9이하 숫자 그리고 %문자를 포함한 문자열과 매칭합니다[^a-zA-Z] 영문이 아닌 문자와 매칭합니다 ^는 부정표현으로 사용합니다 ->실습해보세요!

대괄호식에서는 특수문자의 특별한 힘이 동작하지 않기 때문에, 백슬래쉬\escape 시키지 않아도 됩니다.

Greedy and Lazy match

수량표현식 (* + {})은 욕심많은 연산자이기 때문에, 제공된 데이터에서 최대한 많이 매칭하려고 합니다.

예를 들어, <.+>This is a <div> simple div</div> test 문장에서 <div>simple div</div> 를 매칭시킵니다. 만약 div 태그만 매칭하려면 뒤에 ?를 사용하여 게으르게 만들 수 있습니다.

<.+?>        <  > 사이에 하나 이상의 문자와 매칭하고, 가능한 짧게 매칭합니다.
-> 실습해보세요!

더 나은 방법은, . 연산자를 사용하지 않고 좀더 엄격한 정규식을 사용하는 것입니다.

<[^<>]+>     <  > 사이에 <,>가 아닌 모든 문자가 하나 이상인 문자와 매칭합니다
-> 실습해보세요!

Advanced topics

Boundaries — \b and \B

\babc\b      abc와 동일한 문자를 매칭합니다 -> 실습해보세요!

\b는 anchor 문자(^ 또는 $)와 유사하며 한쪽은 문자를 의미하며, 다른 쪽은 문자가 아닌 단어와 매칭합니다

\B\b와 매치되지 않는 문자열과 매칭합니다. 단어로 쌓여있는 패턴을 찾을 때 사용합니다.

\Babc\B      패턴이 단어로 완전히 둘러싸인 경우 매칭합니다 -> 실습해보세요!

Back-references — \1

([abc])\1           \1은 첫번째 캡쳐그룹과 동일한 패턴을 의미합니다 -> 실습해보세요([abc])([de])\2\1   \2는 두번째 캡쳐그룹과 동일한 패턴을 의미합니다
([abc])([de])([de])([abc])와 동일합니다
(\3, 4 ... 매칭된 그룹을 의미합니다) -> 실습해보세요!
(?<foo>[abc])\k<foo> \k<foo>는 foo이름으로 지정한 그룹을 참조합니다
결과는 첫번째와 동일합니다 -> 실습해보세요!

Look-ahead and Look-behind — (?=) and (?<=)

d(?=r)       r이 바로 뒤에 있는 d를 매칭합니다. 중요한 것은 r은 포함되지 않습니다.
-> 실습해보세요!
(?<=r)d r이 바로 앞에 있는 d를 매칭합니다. 중요한 것은 r은 포함되지 않습니다.
-> 실습해보세요!

또 다른 부정연산자 입니다!

d(?!r)       r이 바로 뒤에 없는 d를 매칭합니다. 중요한 것은 r은 포함되지 않습니다.
-> 실습해보세요!
(?<!r)d r이 바로 앞에 없는 d를 매칭합니다. 중요한 것은 r은 포함되지 않습니다.
-> 실습해보세요!

요약

지금까지 보았듯, 정규식은 응용을 통하여 여러상황에서 사용할 수 있습니다. 개발자라면 충분히 숙지하고 있어야 합니다. 아래는 그 예입니다.

  • 데이터 유효성 검사 (휴대폰, 이메일, 시간문자열 등등)
  • 데이터 스크래핑 (특히, 웹 스크랩핑작업은 특정 패턴으로 정보를 스크랩하는 것이 중요합니다)
  • 문자열 파싱 (URL 쿼리파라미터 파싱, 괄호 파싱 등등)
  • 문자열 대체 (;를 ,로 변경, 대소문자 변경 등등)
  • 문법 highlighting, 파일명 변경, 패킷 스니핑 등등 문자열을 다루는 여러 응용로직에서 사용가능합니다.

재밌게 지내시고 이 문서가 좋았다면 꼭 추천해주세요! :P

Blog https://chrisjune.dev Work for www.29cm.co.kr