정규 표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는 사용하는 형식 언어입니다. 

 다양한 프로그래밍 언어(C++, 자바, 닷넷 파이썬 등등)에서 표준 라이브러리로 지원합니다.

 영어로는 regular expression또는 regex라고 표현합니다. 

 기본적인 문법을 배우고 간단한 예제를 통해서 익혀 봅니다. 

문법

기본 문법

  • 일반적으로 사용하는 일치하는 패턴 찾기
  • 메타 문자 및 수량 한정자를 사용한 검색
  • 그룹 및 look around 기능

메타 문자 정보

메타문자 의  미
^ 문자열의 시작을 의미합니다. 
'[]'의 내부에서 사용할 경우 Not의 의미를 지닙니다. 
^You 패턴의 경우 문자열의 맨 처음에 You라는 단어가 오면 매칭 

[^a-z] 패턴의 경우 a-z이외의 문자를 매칭
$ 문자열의 끝을 의미합니다 end$ 패턴의 경우 end라는 단어로 끝나는 문자열을 매칭
\b 단어의 경계를 의미합니다.  
\s 공백 문자를 의미합니다.  \sof\s 패턴의 경우 ' of ' 문자열을 매칭
\S \s 이외의 문자를 의미합니다.   
\d 숫자를 뜻합니다. [0-9]와 동일한 의미를 가집니다. \d{4} 패턴의 경우 연속된 4자리의 숫자를 매칭합니다.
\D \d 이외의 문자를 의미합니다.   
\w 단어를 만들수 있는 글자를 뜻합니다
[0-9a-zA-Z] 동일한 의미를 가집니다.
\w{9} 패턴의 경우 9글자 이상의 단어를 찾습니다. 
\W \w 이외의 문자를 의미합니다.  
\n 줄바꿈 문자를 찾습니다.  
\ 정규식상의 특별한 의미가 있는 기호를 문자로
사용 할 때 앞에 붙여 줍니다.

\., \*, \$, \( 같이 지정해주면 메타문자를
문자로 사용 할 수 있습니다. 
\.\.\. 패턴의 경우 ...이라는 단어를 검색합니다.
. 임의의 문자 1개에 대응합니다. ... 패턴으로 검색하는 경우 3자리의 임의 문자를 검색합니다.

or 연산자 

 | 문자를 사용하면 A|B 패턴의 형태로 or 연산으로 매칭 할 수 있습니다. 

 예를 들어서  banana와 apple을 찾는다면 아래와 같이 정의할 수 있습니다.

// banana와 apple을 검색합니다. 
banana|apple

 그룹 묶기와 함께 쓰이면 더욱 다양한 검색이 가능합니다. 

그룹 묶기

 ( )로 둘러싼 단위는 그룹을 나타냅니다. 그룹은 패턴내에서 하나로 묶여지는 패턴 조각을 말합니다. 

// best, forest, honest라는 단어 검색하는 정규식
(b|for|hon)est 

 예를 들면 위와 같이 검색을 한다면 or연산자와 그룹 묶기가 같이 쓰여서 다양한 단어를 검색할 수 있습니다. 

 또한 그룹은 캡처를 통한 참조기능을 지원합니다. 참조 기능을 사용하려면 '\숫자' 형태로 호출 할 수 있습니다.

 숫자는 1부터 시작되며 그룹이 호출된 순서를 따릅니다. 

# (na)를 그룹으로 묶으면 참조 1을 호출해서 재사용할 수 있습니다 
# 아래의 정규식은 ba(na)(na)와 동일합니다. 
ba(na)\1

# (na)가 두번째로 그룹으로 만들어졌기 때문에 참조 2를 통해서 호출 합니다. 
(ba)(na)\2

 위의 예제를 보면 banana를 검색할 수 있는 다양한 정규식을 볼 수 있는데 그룹의 참조 기능을 사용합니다. 

비 캡쳐링 그룹

 (?:)를 지정해서 그룹을 묶는다면 그룹으로 사용할 수 있지만 캡쳐하지 않습니다. 

수량 한정자 

메타문자 의  미
? 문자가 0또는 1번의 반복되는지 체크합니다. 'bananas?' 라고 검색을 하면 s 문자가 없거나 하나일때만 검출됩니다. 
즉 banana, bananas만 체크됩니다.
* 문자가 0번 이상 발생되는지 확인합니다.  'ab*c'는 b문자가 없거나 하나 이상일 때 검출됩니다.
예를들어 ac, abc, abbc, abbbbc는 체크됩니다.
abdc는 체크되지 않습니다. 
+ 문자가 1번 이상 반복되는지 체크합니다.  'ab+c'는 b문자가 하나 이상일 때 검출됩니다.
예를들어 abc, abbc, abbbbc는 체크됩니다.
ac, abdc는 체크되지 않습니다. 
{n} N번 만큼 반복되는지 체크합니다. '\d{3}'는 숫자가 3개 연속으로 있는지 체크합니다
{n,m} N번이상, M번 이하로 반복되는지 체크합니다.  
{n,} N번 이상 반복되는지 체크합니다.  '\d{3,}'는 숫자가 3개 이상이 연속으로 있는지 체크합니다

 

정규식을 사용한 예제

 정규식을 테스트하기 위해서 notepad++를 사용합니다.

 notepad에서 Ctrl + F를 눌러서 찾기 기능을 살펴보면 정규 표현식을 설정할 수 있습니다. 

IP주소 검색하기

 정규식으로 IP 주소를 검색하려면 IP 주소의 규격을 정규식으로 표현해야합니다.

# '\d{1,3}'는 1에서 3자리의 연속적인 숫자를 표현합니다
# '\.'는 .을 표현합니다.
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

 IP 주소는 위와 같은 형태의 정규식 구조를 가집니다. 

 '\d{1,3}' 는 1자리에서 3자리의 연속적인 숫자를 검색합니다.

 '\.'는 .을 검색함으로써 반복적인 패턴을 통해서 IP주소를 표현합니다.

# '\.\d{1,3}'을 3번 반복합니다.
\d{1,3}(\.\d{1,3}){3}

 반복적인 패턴을 단순화하기 위해서 수량한정자 {n}를 사용해서 더욱 간단하게 표현할 수 있습니다. 

notepad에서 ip주소 검색

 notepad를 통해서 테스트 해보면 정상적인 IP정보만 검색되는 것을 확인 할 수 있습니다. 

전화번호 검색하기

 전화번호는 IP처럼 규격화된 방식이 아닌 다양하게 표현될 수 있습니다.

#전화번호의 다양한 표현방식
010-1234-5678
010.1234.5678
01012345678
010 1234 5678

 예를 들어서 010-1234-5678이라는 전화번호는 위의 예제처럼 표현될 수 있기 때문에 검색하기가 까다롭습니다. 

 이번의 정규식 패턴 예제에서는 위에서 표현된 4가지 조건에 맞는 검색 방식을 찾도록 합니다. 

# 정규식으로 전화번호 표현
01[016789]\D?\d{3,4}\D?\d{3,4}

# 반복 구문 수량한정자로 표현
01[016789](\D?\d{3,4}){2}

  위와 같은 정규식을 사용하면 전화번호를 표현할 수 있습니다. 

 '01[016789]'는 010, 011, 016, 017, 018, 019의 패턴을 검색합니다. 

 '\D?'는 숫자가 아닌 문자를 표현하며 ? 수량한정자로 인해서 0개 또는 1개가 반복되는 문자를 검색합니다. 

 '\d{3,4}'는 3자리에서 4자리의 숫자의 패턴을 검색합니다.

 위의 정규식은 위의 4가지 전화번호의 형태를 모두 검색할 수 있습니다. 

정규식을 사용한 전화 번호 검색

'기타' 카테고리의 다른 글

[동기화] 데이터 레이스  (2) 2019.09.21

+ Recent posts