[번역] - 정규표현식

김주형·2022년 11월 5일
0

자라기

목록 보기
3/22

Reference


정규표현식이란?

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

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

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

Basic topics

Anchors — ^ and $

^The       The 로 시작하는 모든 문자열을 매칭합니다 -> [실습해보기](https://regex101.com/r/cO8lqs/2)
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/i는 AbC를 매칭합니다)

Intermediate topics
Grouping and capturing — ()

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

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

? 형태를 사용하여 그룹에 이름을 지정하면 값을 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

simple div
test 문장에서
simple 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, 파일명 변경, 패킷 스니핑 등등 문자열을 다루는 여러 응용로직에서 사용가능합니다.
profile
왔을때보다좋은곳으로

0개의 댓글