티스토리 뷰

기술 및 이슈

정규표현식이란?

Univdev 2020. 6. 13. 04:31

개요

우리는 웹 사이트를 개발하건, 게임을 개발하건, 아무튼 뭘 개발하건 사용자로부터 어떤 특정한 값을 얻어야 할 때가 있다. 음식점에 배달을 시킬 때 집 주소를 입력하거나, 게임에서 캐릭터를 만들 때 닉네임을 정한다던지 말이다.

그런데 사용자가 정말 개발자의 의도대로 입력값을 넣어준다면 정말 좋을텐데, 사용자는 그렇게 착하지 않다.

주소지를 입력하는 창에 한 편의 소설을 적을 수도 있고, 닉네임에 불쾌감을 주는 단어나 무슨 뜻인지도 모르겠는 특수문자들을 남발하는 경우가 있을 것이다. (개발지식이 있는 유저들은 게임 닉네임으로 코드를 짜고 있겠지)

 

플레이타임보다 더 오랜 시간을 사용하는 구간

서비스 제공자는 이러한 사용자들의 똘끼(?)를 언제나 염두에 두고 있어야 하며, 사용자가 어떤 이상한 짓을 해도 프로그램이 개발자의 의도 하에서 제어가 될 수 있도록 설계를 해야 한다.

어떻게?

이렇게 사용자가 뭔 값을 집어넣을지 모르는 상황에서는 대처하기가 참 난감하다.

대학교에서 한 번쯤은 해본 계산기 만들기 프로그래밍 실습이였다면 '숫자를 0으로 나눌 수 없다.' 정도의 난이도였을거고, 이런 상황이라면 조건문을 이용해서 0이 아닌 경우에만 계산을 진행하도록 구성할 수 있는데, 위 경우는 사용자가 입력할 값을 모르니 대처조차 할 수 없다.

그래서 정규표현식이라는 방식이 등장했다. 말 그대로 사용자의 표현 방법에 일종의 공식을 붙이는 것이다.

 

예를 들어보자면, 집에 들어올 때 도어락에 비밀번호를 입력해야 하는 상황이라고 쳐보자.

이 방식이 평소에는 문제가 없는데, 만약 복도에 누가 있어서 비밀번호를 엿보진 않을까 걱정 되는 상황이라면?

손으로 가리고 치기에도 한계가 있고, 뭔가 복도에 있는 죄 없는 사람을 의심하는 듯한 죄책감이 들 수도 있다.

그럴 때 일부 도어락은 비밀번호로 등록한 숫자가 입력값 사이에 들어있다면 어떤 숫자를 입력해도 문이 열리도록 설계되어 있다.

비밀번호가 1234라면 13571234772 를 입력해도 열린다는 얘기이다.

고의적으로 비밀번호를 길게 눌러서 외울 수 없도록 설계한 것이다.

이렇게 "올바른 비밀번호가 문자열 어디에라도 있다면 열어라." 라고 표현 방법에 공식을 부여하는 것이 정규표현식이다.

예제

정규표현식은 현존하는 거의 대부분의 언어에서 지원한다. 그러니 Javascript에서도 당연히 지원할 것이고, 아래 예제는 Javascript로 작성되어 있다.

아래 표현식은 이메일 양식인지 체크하는 간단한 코드이다.

if (email.match(/^(\w+)@(\w+)(\.\w+){1,2}$/)) {
	console.log('이메일!');
}

위 코드에서 사용 된 정규표현식은 아래와 같다.

(\w+)@(\w+)(\.\w+){1,2}

정규표현식이 생소한 사람이라면 뭔 외계어인가 싶겠지만 의미를 따지고보면 간단하다.

우리가 수학에서 식의 특정 부분을 그룹화 할 때는 괄호를 사용하도록 배웠다. 정규표현식도 마찬가지이다.

굳이 괄호가 없어도 되는 예제였지만 좀 더 알아보기 쉽게 하기 위해서 괄호로 부분 부분 나뉘어서 설명하겠다.

(\w+)

이 부분에서 \w는 알파벳 소문자 및 대문자, 숫자, 언더바를 포함한 문자 구성을 말한다.

뒤에 붙은 + 기호는 앞에 나온 구조가 1번 이상 나와야 한다는 얘기이다.

붙여서 설명하자면, 알파벳 소문자 및 대문자, 숫자, 언더바 범위 안에 들어가는 문자가 최소 한 번 이상은 등장해라. 라는 말이다.

@

다음은 @(앳) 기호인데, 표현식으로써의 특별한 의미는 없고, 이메일 주소 사이에 들어가는 앳을 찾기 위해 사용한다.

(\w+)

이 부분은 위에 적혀 있으니 생략한다.

(\.\w+){1,2}

\.는 단순히 .(점) 문자를 나타낸다. 앞에 붙은 \(역슬래시)는 이 점은 표현식으로써의 의미가 아닌, 단순히 점으로써의 의미만을 가져라. 라는 의미로 붙이는 것이다. (참고로 표현식에서 점 기호는 컴퓨터에서 표현 가능한 모든 기호 및 문자를 의미한다.)

 

\w+는 위에 있으니 생략한다.

 

{1,2}는 앞에 있는 조건이 1번부터 2번까지 등장해야 한다는 얘기이다.

도메인에 보면 .com이나 .net처럼 점 문자가 한 번만 등장하는 도메인이 있고, .co.kr이나 .co.jp처럼 점 문자가 두 번 등장하는 도메인도 있다.

해당 유형의 도메인을 모두 충족시키기 위해서 1번 아니면 두 번 등장하도록 설계한 것이다.

 

표현식의 역할을 실제 문자열과 대조해보면 다음과 같다.

(\w+)@(\w+)(\.\w+){1,2}

rhdwkrxla68@gmail.com

rhdwkrxla68@gmail.co.kr

이렇게 표현이 된다.

마치며

정규표현식은 위에서 사용 된 연산자 뿐 아니라 정말 많은 연산자가 존재한다. 이를 다 외울 필요는 전혀 없고, 현업에서 프로젝트 몇 번 뛰면서 작업하다보면 자주 사용하는 연산자는 자연스레 몸이 기억하게 될 것이니 너무 걱정할 필요 없다.

다른 연산자에 대해서 알고 싶은 독자는 아래의 링크를 참고하길 바란다.

https://en.wikipedia.org/wiki/Regular_expression#basic-concepts

LIST

'기술 및 이슈' 카테고리의 다른 글

[Jest] 단위 테스트 맛보기  (0) 2021.08.10
[수학] Sine Graph  (0) 2020.11.12
Restful API란?  (0) 2020.05.25
웹앱의 퍼포먼스를 늘리는 법  (0) 2020.05.22
[eslint] Expected linebreaks to be 'LF' but found 'CRLF' 이슈  (0) 2019.11.27