프로그래밍

정규 표현식(Regex)에 대해 알아보기

인생마린 2022. 1. 8. 17:07
반응형

Regex(Regular Expression)란 무엇인가?

regex 예시

Regex(Regular Expression), 우리말로 정규표현식이라 불리는 이것은 규칙을 가진 문자열을 찾는데 사용하는 형식 언어이다. 비밀번호 규칙을 검사하거나, 핸드폰 번호가 제대로 입력되었는지 확인하거나, 입력받은 이메일이 유효한지 확인하는 등 유효한 방법으로 사용될 수 있다.

하지만 이러한 규칙을 정의하는데 있어서 정규표현식은 너무나 난해하여 가독성이 떨어지고 어떠한 규칙을 취하는지 알 수 없다. 또한 필요할때만 사용하고 자주 사용하지 않기 때문에 문법을 금방금방 까먹는다는 단점이 있다. 그리고 표현식을 작성 할 때 예외 케이스를 잡는것이 무척이나 까다롭기 때문에 충분한 테스트 케이스를 두고 작성하는 것이 좋다.

 

정규표현식을 공부할 때 유용한 사이트

 

RegExr: Learn, Build, & Test RegEx

RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).

regexr.com

본인이 작성한 정규표현식이 올바른지 확인할때 해당 사이트를 통해 확인할 수 있다.

Expression 부분에 표현식을 적고, Text에 검사할 문단을 넣어주면 된다.

본 글에서는 위 사이트를 통해 정규표현식이 잘 작성되었는지 확인하고 실습할 것이다.

 

사이트에 처음 들어가면 예문과 기본 표현식이 들어가 있는데, 한번 모든 단어를 검색하는 간단한 표현식을 한번 작성해보자.

 

\w+

단어들만 선택하는 표현식

먼저 \w은 Word 즉 영어 대소문자, 숫자, 언더바를 의미한다. 이는 정규표현식으로 [A-Za-z0-9_]와 일치하는데, 자주쓰이는 정규표현식을 정의해둔것이라고 이해하면 되겠다. 당연히 한글은 포함되지 않기 때문에 잡히지 않으며, 특수문자들 또한 잡히지 않는것을 확인 할 수 있다.

그 다음으로 확인할 수 있는것은 +인데 이는 \w에 해당하는 것이 1개이상 포함되는것을 의미한다.

 

 

 

Regexper

 

regexper.com

또 다른 사이트로 Regexper이라고 있다. 난해한 문법으로 직관력이 떨어지는 정규표현식을 그림으로 나타내어 직관력 있게 어떤 의미를 가지는지 알 수 있게 도와준다. 아래 예시는 전화번호 검사에 대한 예제를 집어넣은 것이다.

 

 

 

정규표현식 문법

단순 문자찾기

우리가 ctrl + f를 눌러서 문자를 찾듯이 단어를 입력하면 해당 단어를 찾을 수 있다. 정규표현식에서는 대소문자를 구분하는 것을 확인 할 수 있습니다.

 

시작과 끝을 나타내는 특수문자(^, $)

문장에서 특정 문자 여러개를 찾을 수도 있겠지만, 이메일, 전화번호, 주민등록번호 등은 처음부터 끝까지 해당 정보에 대한 문자열만 담겨져 있어야 합니다. 우리가 세운 규칙 외의 문자가 들어가는 것을 원하지 않을 때, 정규표현식 양끝쪽에 ^와 $을 넣어줍니다. ^은 문자열의 시작 의미하고, $은 문자열의 끝을 의미합니다. 해당 특수문자는 반드시 표현식의 끝에 넣어주어야 합니다.

$를 붙이지 않은 경우
$를 붙인경우

사용자가 world만 입력하게 하고 싶은 경우, 아래와 같이 마지막에 $를 붙이면 world이외의 문자가 들어가는 경우 표현식에 잡히지 않는 것을 볼 수 있습니다.

 

^은 문자열의 처음을 의미하기 때문에 표현식 중간에 넣을 경우 원하는대로 작동되지 않을 것입니다.

잘못된 사용 예시
^에 대한 추가 설명

^은 기본적으로 시작지점에 대한 정규식을 검사하지만, multiline flag인 m을 설정할 경우 각 줄의 시작지점에 대하여 표현식을 검사 할 수 있습니다.

 

문자집합을 표현하는 대괄호

집합이라고 하면 여러개의 원소들을 모아놓은것인데요. 대괄호를 통해 문자를 묶는 경우 대괄호 안의 즉 집합에 포함된 원소가 쓰여졌는지 검사 할 수 있습니다. 쉽게 애기하면 괄호 안에 있는 내용 중 임의의 한 문자가 쓰였는지 확인하는 것입니다.

두번째에 a, e가 들어가는 경우 ok

위의 예시의 경우 대괄호 안에 원소로 a와 e가 들어있습니다. 따라서 hallo와 hello 두가지 경우가 매치되는 것을 확인 해볼 수 있습니다.

 

문자집합을 부정(^)

집합에 포함되지 않은 원소가 쓰여졌는지 검사하고 싶은 경우 대괄호 안 맨 앞에 특수문자 ^를 적어주면 집합이 부정됩니다. 대괄호 안에 쓰이므로써 앞에서 나왔던 ^과 문법적으로 다른 의미를 가지게 된다는것을 유의해주세요.

두번째에 a, e가 들어가지 않는 경우 ok

집합의 원소 묶음표현(-)

a부터 z까지 알파벳인지 검사하고 싶은 경우, 집합에 a~z까지 모든 알파벳을 다 써줘야 할까요?

이는 매우 귀찮은 과정이 될 것입니다. 특수문자 -으로 char code상 연속된 것을 묶음으로 표현 할 수 있습니다.

a부터 z까지 원소가 매치되는 경우 ok

마찬가지로 대문자와 숫자도 포함 하고 싶다면 -를 이용하여 이어서 써주시면 됩니다.(띄워쓰기 하는 경우 띄워쓰기가 원소에 포함됩니다.

숫자도 알파벳 대문자도 포함

문자열의 묶음 처리 소괄호

여러개의 문자를 하나의 묶음으로 표현하고 싶을 때, 소괄호를 통해 묶어줍니다. 소괄호로 묶인 부문은 정규표현식에서 group으로 인식하며, 검색시 해당 group에 대한 내용에 대하여 접근하여 변경 또는 읽어들일 수도 있습니다.

소괄호로 묶은 부분을 group으로 접근해 변경 또는 읽어들일 수 있다.

or연산자 활용

여러개의 문자열을 매칭하고 싶다면 특수문자 |를 활용 할 수 있습니다.

소괄호 없이 or연산자를 사용할 경우 다음과 같이 작동합니다. or연산자의 범위가 지정되지 않았기 때문이 | 위치가 분기점이 된 것입니다.

소괄호가 없는 경우

# 규칙반복처리

## 중괄호를 이용해 여러번 반복

## 특수문자를 이용해 여러번 반복 * + ?

 

# 표현식에 사용되는 문자 Escape

 

# 정규식 Flag

 

 

# 총정리 및 요약

 

# 파이썬으로 사용해보는 Regex

자주 쓰이는 정규표현식

숫자

정수

^[+-]?[0-9]+$

실수

^[+-]?[0-9]+.?[0-9]*$

화폐(콤마 포함)

^[+-]?[0-9,]+.?[0-9]*$

전화번호

일반적인 전화번호 규칙 xxx-xxxx-xxxx

^\d{3}-\d{3,4}-\d{4}$

특정 앞번호의 전화번호만 받는 경우(010, 012, 011)

^(010|012|011)-\d{3,4}-\d{4}$

번호적을때 -을 적지않는것도 허용하는 경우

^\d{3}(-\d{3,4}-\d{4}|\d{3,4}\d{4})$

 

이메일

일반적인 이메일 규칙 xxx@xxx.xxx

^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$

id와 도메인에 . - _ 포함 가능

특정 도메인만 허용

^[\w-\.]+@(gmail.com|naver.com|kakao.com)$

 

주민등록번호

비밀번호

도메인 http, https

^(http(s)?:\/\/)([\w]+\.*)+[a-z0-9]{2,4}$

url 쿼리 검사

(\?|\&)([^=]+)\=([^&]+)

 

URL 검사

HTML 태그

날짜

파일 확장자

Hex 색상번호 검사

한글검사

자음, 모음 미포함

[가-힣]+

자음, 모음 포함

[가-힣ㄱ-ㅎㅏ-ㅣ]+

반응형