외우는 것이 아니라 찾아서 적용하고 활용할 수 있으면 된다.!!

프로그래머스 사이트의 정규표현식 강의


정규표현식 연습사이트


정규표현식 기본 정리


기본용어 

정규 표현식에서 사용되는 기호를 Meta문자라고  표현한다. 표현식에서 내부적으로 특정 의미를 가지는 문자를 말하며 간단하게 정리하면 아래의 표와 같다.
 표현식
의미 
 ^x
 문자열의 시작을 표현하며 x 문자로 시작됨을 의미한다.
x$
 문자열의 종료를 표현하며 x 문자로 종료됨을 의미한다.
 .x
 임의의 한 문자의 자리수를 표현하며 문자열이 x 로 끝난다는 것을 의미한다.
 x+
 반복을 표현하며 x 문자가 한번 이상 반복됨을 의미한다.
 x?
 존재여부를 표현하며 x 문자가 존재할 수도, 존재하지 않을 수도 있음을 의미한다.
 x*
 반복여부를 표현하며 x 문자가 0번 또는 그 이상 반복됨을 의미한다.
 x|y
 or 를 표현하며 x 또는 y 문자가 존재함을 의미한다.
 (x)
그룹을 표현하며 x 를 그룹으로 처리함을 의미한다.
 (x)(y)
그룹들의 집합을 표현하며 앞에서 부터 순서대로 번호를 부여하여 관리하고 x, y 는 각 그룹의 데이터로 관리된다.
 (x)(?:y)
그룹들의 집합에 대한 예외를 표현하며 그룹 집합으로 관리되지 않음을 의미한다. 
 x{n}
 반복을 표현하며 x 문자가 n번 반복됨을 의미한다.
 x{n,}
 반복을 표현하며 x 문자가 n번 이상 반복됨을 의미한다.
 x{n,m}
 반복을 표현하며 x 문자가 최소 n번 이상 최대 m 번 이하로 반복됨을 의미한다.


Meta 문자들 중에서 좀 더 특수하게 사용되는 문자들이 존재한다. '[]' 는 내부에 지정된 문자열의 범위 중에서 한 문자만을 선택하다는 특수한 의미를 가진다. 그리고 내부에서 Meta문자를 사용하면 다른 의미를 가지고 동작할 수 있으므로 잘 확인하고 사용해야 한다. 좀 더 특별한 용도로 사용되는 것들은 아래의 표와 같다. 
 표현식
의미 
[xy]
문자 선택을 표현하며 x 와 y 중에 하나를 의미한다.
 [^xy]
not 을 표현하며  x 및 y 를 제외한 문자를 의미한다.
 [x-z]
range를 표현하며 x ~ z 사이의 문자를 의미한다. 
 \^
escape 를 표현하며 ^ 를 문자로 사용함을 의미한다.
 \b
word boundary를 표현하며 문자와 공백사이의 문자를 의미한다.
 \B
non word boundary를 표현하며 문자와 공백사이가 아닌 문자를 의미한다.
 \d
digit 를 표현하며 숫자를 의미한다. 
 \D
non digit 를 표현하며 숫자가 아닌 것을 의미한다. 
 \s
space 를 표현하며 공백 문자를 의미한다. 
 \S
non space를 표현하며 공백 문자가 아닌 것을 의미한다.
 \t
tab 을 표현하며 탭 문자를 의미한다.
 \v
vertical tab을 표현하며 수직 탭(?) 문자를 의미한다.
 \w
word 를 표현하며 알파벳 + 숫자 + _ 중의 한 문자임을 의미한다. 
 \W
non word를 표현하며 알파벳 + 숫자 + _ 가 아닌 문자를 의미한다. 


정규표현식을 사용할 때 Flag 라는 것이 존재하는데 Flag를 사용하지 않으면 문자열에 대해서 검색을 한번만 처리하고 종료하게 된다. Flag는 다음과 같은 것들이 존재한다.
 Flag
의미 
 g
Global 의 표현하며 대상 문자열내에 모든 패턴들을 검색하는 것을 의미한다. 
 i
Ignore case 를 표현하며 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미한다.
 m
Multi line을 표현하며 대상 문자열이 다중 라인의 문자열인 경우에도 검색하는 것을 의미한다. 



예제 

개별 숫자 - /[0-9]/g
전체에서  0~9사이에 아무 숫자 '하나'  찾음 

개발 문자 - /[to]/g
전체에서 t  혹은 o  를 모두 찾음 

단어 - /filter/g
전체에서  f 따로 i 따로 찾는게 아니라 'filter' 라는 단어에 매칭되는것을 찾음 

단어 제외 - /\b(?:(?!to)\w)+\b/g
전체에서 'to' 라는 단어를 빼고 다른 단어 매칭 /  확인결과 "Tutorial" 도 제외됨. 

단어 제외 - \b(?!\bto\b)\w+\b
전체에서 'to' 라는 단어를 빼고 다른 단어 매칭 /  확인결과 "Tutorial" 는 제외 안됨.  이게 더 정확하다고 볼수있을듯. 

\b # assert at a word boundary
(?! # look ahead and assert that what follows IS NOT...
\b # a word boundary
word # followed by the exact characters `word`
\b # followed by a word boundary
) # end look-ahead assertion
\w+ # match one or more word characters: `[a-zA-Z0-9_]`
\b # then a word boundary


이메일 - /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i

'시작을'  0~9 사이 숫자 or a-z A-Z 알바펫 아무거나로 시작하고  /  중간에 - _  . 같은 문자가 있을수도 있고 없을수도 있으며 / 
그 후에 0~9 사이 숫자 or a-z A-Z 알바펫중 하나의 문자가 없거나 연달아 나올수 있으며 /  @ 가 반드시 존재하고  / 
0-9a-zA-Z 여기서 하나가 있고  /  중간에 - _  . 같은 문자가 있을수도 있고 없을수도 있으며 / 그 후에 0~9 사이 숫자 or a-z A-Z 알바펫중 하나의 
문자가 없거나 연달아 나올수 있으며 /  반드시  .  이 존재하고  / [a-zA-Z] 의 문자가 2개나 3개가 존재 /   이 모든것은 대소문자 구분안함 
 

전화번호 - /^\d{3}-\d{3,4}-\d{4}$/

시작을 숫자 3개로하며 /   중간에 하이픈 -  하나 존재 /  숫자가 3~4개 존재하며 /  하이픈 하나 존재 /  숫자 4개로 끝남 

핸드폰 번호 - /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/

시작을 숫자 01로 시작하며 그 후에 0,1,6,7,8,9 중에 하나가 나올수도 있으며 /  하이픈 - 하나 존재할수도 있으며 /  숫자 3~4개 이어지고 / 
또 하이픈 - 하나 존재할수도 있으며 /  숫자 4개가 이어짐 

URL - ^(https?):\/\/([^:\/\s]+)(:([^\/]*))?((\/[^\s/\/]+)*)?\/?([^#\s\?]*)(\?([^#\s]*))?(#(\w*))?$

^(https?):\/\/
([^:\/\s]+)
(:([^\/]*))?

((\/[^\s/\/]+)*)?\/?([^#\s\?]*)(\?([^#\s]*))?(#(\w*))?$



전방탐색과 후방탐색

원하는 문자를 검색하기 위하여 정규식을 사용하였지만 어디서부터 문자를 찾을지 정해야할때도 있습니다. 이때 전후방탐색(lookaround)를 사용해야합니다.

전방탐색 - 앞에서 찾기

전방탐색(lookahead)패턴은 일치 영역을 발견해도 그 값을 반환하지 않는 패턴을 말합니다. 전방탐색은 실제로는 하위 표현식이며, 하위 표현식과 같은 형식으로 작성됩니다. 전방탐색 패턴의 구문은 ?=로 시작하고 등호(=) 다음에 일치할 텍스트가 오는 하위 표현식입니다.
 일부 정규 표현식 문서에 일치하는 영역을 반환하는 동작을 표현할 때 소비한다(consume)라는 용어를 사용합니다. 전방탐색은 소비하지 않는다(not consume)라고 말합니다.
다음 예제에서 어떻게 사용하는지 살펴봅니다.
예문)
정규 표현식)
.+(?=:)
결과)
http
https
ftp
예제에 나열된 URL에서 프로토콜은 :을 기준으로 분리가 되며 .+패턴은 프로토콜과 일치하고 (?=:)는 :과 일치합니다. 이때 :를 찾되 :앞에 있는 문자열을 찾으라고 하며 :는 소비되지 않습니다.
그렇다면 ?=가 없다면 어떻게 동작하는지 다음 예제를 봅니다.
예문)
정규 표현식)
.+(:)
결과)
http
https
ftp
하위표현식 :과 일치하고 문자열을 소비하여 위에서 나온 결과와 같이 나타납니다.

후방탐색 - 뒤에서 찾기

텍스트를 반환하기 전에 뒤쪽을 탐색하는 것은 후방탐색(lookbehind)이라고 합니다. 후방탐색 연산은 ?<=입니다.
기본적으로 후방탐색의 사용방법은 전방 탐색과 같습니다. 하위 표현식 안에서 사용하고 일치할 텍스트 앞에 옵니다.
다음 예제에서 어떻게 사용하는지 살펴봅시다.
예문)
ABC01: $23.45
HGG42: $5.31
CFMX1: $899.00
XTC99: $69.96
Total items found: 4
정규 표현식)
(?<=\$)[0-9.]+
결과)
23.45
5.31
899.00
69.96
$ 기호와 일치하지만 소비하지 않고 뒤에 숫자만 반환합니다.

전방탐색과 후방탐색 함께 사용하기

예문)
<HEAD><TITLE>Ben Forta`s Homepage</TITLE></HEAD>
정규 표현식)
(?<=\<[tT][iI][tT][lL][eE]\>).*(?=\<\/[tT][iI][tT][lL][eE]\>)
결과)
Ben Forta`s Homepage
(?<=\<[tT][iI][tT][lL][eE]\>)는 후방탐색 작업으로 <TITLE>과 일치하며 소비하지 않습니다.. (?=\<\/[tT][iI][tT][lL][eE]\>)도 같은 방식으로 </Title>과 일치하며, 소비하지 않습니다. 따라서 제목 텍스트만 반환합니다..

부정형 전후방탐색

앞에서 봤던 전방탐색과 후방탐색은 찾고자 하는 부분의 앞뒤를 특별히 지정하고 싶을 때 주로 사용되며 이러한 방법들은 긍정형 전방탐색, 긍정형 후방탐색이라고 합니다. 실제로 일치하는 텍스트를 찾기 때문이죠.
부정형 전방탐색은 앞쪽에서 지정한 패턴과 일치하지 않는 텍스트를 찾고 부정형 후방탐색도 마찬가지로 뒤쪽에서 지정한 패턴과 일치하지 않는 텍스트를 찾습니다.
부정형 전후방탐색에서 부정형을 나타낼때는 등호(=) 대신 느낌표(!)를 사용합니다.
종류
설명
(?=)
긍정형 전방탐색
(?!)
부정형 전방탐색
(?<=)
긍정형 후방탐색
(?<!)
부정형 후방탐색

<div class="alert-info"> : 전후방탐색을 지원하는 정규 표현식은 긍정형, 부정형을 지원합니다.</div>
다음 예제에 가격과 수량을 나타내는 숫자들이 있습니다. 긍정형에서는 가격, 부정형에서는 수량을 얻을 것입니다.
예문)
I paid $30 for 100 apples,
50 oranges, and 60 pears.
I saved $5 on this order.

긍정형

정규 표현식)
(?<=\$)\d+
결과)
30
5
\d+는 하나 이상 연속된 숫자와 일치하고 (?<=$)는 긍정형 후방탐색이며, $로 $ 기호를 찾습니다. 하지만 소비하지 않으므로 가격만 일치합니다.

부정형

정규 표현식)
\b(?<!\$)\d+\b
결과)
100
60
\d+는 하나 이상 연속된 숫자와 일치하고 (?!$)는 부정형 후방탐색이므로 앞에 $ 기호가 없는 숫자와 일치합니다. 이때 \b를 사용하여 경계를 표시하여 $30에 0이 일치할 수 있는 경우를 제외시켜 수량만 얻을 수 있도록 합니다.