정규 표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는 사용하는 형식 언어입니다.
다양한 프로그래밍 언어(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정보만 검색되는 것을 확인 할 수 있습니다.
전화번호 검색하기
전화번호는 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 |
---|