정규식 포기자를 위한 가장 쉬운 정규식 — 상편

정규식 일타강사가 되어보자!

Harry The Great
해리의 유목코딩
6 min readFeb 18, 2020

--

정규식의 내용 자체는 사실 많은 로직이 들어간다거나 혹은 연산이 들어가지 않는데도 불구하고 뭔가 항상 쓸 때가 되면 생각도 잘 안 나고 내용을 찾아봐도 와닿지 않습니다. 개인적으로 가장 큰 이유는 아무래도 낯선 기호와 엄청나게 떨어지는 가독성 인 것 같습니다. 이번 편은 항상 정규식을 봤지만 헷갈리시던 분들을 위해 작성했습니다. 최대한 어려운 내용은 피했습니다!

실습은 아톰(Atom) 에디터에서

예제들은 아톰(Atom) 에디터에서 시연했고 찾기(맥의 경우 Cmd + F)를 눌러 나오는 찾기 메뉴에서 오른쪽 하단 2개의 메뉴를 활성화하고 Find in current Buffer영역에 작성하면 저와 동일한 화면에서 테스트해보실 수 있습니다.

가나다 가장 첫걸음부터

가나다
마바사
아자차
하타카
타카나

정규식은 매칭되는 텍스트를 찾아주기때문에 단순히 가나다만 입력해도 선택이 됩니다.

대괄호 사용하기 — []

하지만 최상단 완전일치되는 가나다이외에 나머지를 선택하려한다면 문제가 발생합니다. 그때는 대괄호[]를 사용할 수 있습니다. 대괄호는 괄호안에 매칭되는 모든 텍스트를 선택합니다.

[가나다라마바사아자차카타파하]

이번에는 가나다가 선택되긴 했지만 가, 나 , 다 개별단어들이 선택되었습니다. 만약 프로그램 내에서 정규식 라이브러리를 이용해서 추출한다면 개별 글자들이 배열의 형태로 추출됩니다. 그렇다면 가나다, 마바사, 아자차 단위로 추출하려면 무식하지만 3번 반복하면됩니다.

[가나다라마바사아자차카타파하][가나다라마바사아자차카타파하][가나다라마바사아자차카타파하]

각 대괄호는 개별글자를 의미하기때문에 3글자씩 선택됩니다.

중괄호 사용하기 — {}

중괄호는 몇 번 연속되는지를 정의해줄 수 있습니다. 예를 들어 3번 선택한다고 하면 중 괄호와 함께 3을 입력합니다.

[가나다라마바사아자차카타파하]{3}

사람이름

김세호
김진영
이진수
김진수
오진수

이제 우리가 했던 정규식은 가~하 범위까지만 선택되기 때문에 이름에는 사용할 수 없습니다. 자 그럼 한글을 추가하기 위해 이제 한글 표를 보겠습니다.

당연히… 입력하기에는 너무 많습니다. 이럴 때 대시(-)를 사용할 수 있습니다.

범위를 나타내는 대시

대시(-)는 시작 문자부터 끝 문자까지의 모든 유니코드를 선택해줍니다.

[가-힣]{3}

[가-힣]{3}으로 입력을하면 부터 까지의 모든 유니코드를 선택하기 때문에 이름들이 선택되게 됩니다.

횟수를 표현하는 연산자들

김세호
김진영
남궁진수
김진수
이준
오진수

이번에는 난도가 조금 더 올라갔습니다. 이전에 우리가 사용했던 식은 이름이 3글자이신 분만 선택이 됩니다. 중괄호는 숫자 하나만 입력하면 정확하게 반복수가 일치해야 하지만 두개의 숫자를 입력하면 범위를 지정해줄 수 있습니다.

`[가-힣]{2,4}` = 2번에서 4번까지 반복되는경우

이제 이름이 2글자에서 4글자이신 모든 분들이 선택됩니다. 몇 가지 범위표현을 더 알아보면

  • 별표(*) — 한번도 매치되지 않거나 또는 여러번 매치
  • 십자(+) — 한번 또는 그 이상 매치
  • 물음표(?) — 한번도 매치되지 않거나 또는 한번만 매치

[가-힣]{2,4}[가-힣]+ 즉 한 글자 이상으로 적용을 해도 동일한 결과를 얻을 수 있습니다. 그럼 위 내용을 활용해서 이번에는 김 씨와 이 씨 이신분들만 선택해보겠습니다. [김이][가-힣]+라고 입력하게 되면 글자의 시작이 , 인경우와 한글이 1글자 이상인 경우가 선택되어 아래처럼 선택됩니다.

야구구단

LG
키움
롯데
한화
NC

이번에는 영문자가 함께 나왔습니다. 이전에 우리가 사용했던 식은 한글 유니코드 범위만 지정되어있어 LG와 NC는 선택되지않습니다. 영문자도 마찬가지로 소문자는 a-z 그리고 대문자는 A-Z로 표현할 수 있습니다.

[A-Z가-힣]+

이제 영문대문자도 함께 선택되었습니다. 다음은 전체 구단명으로 해보겠습니다.

LG 트윈스
키움 히어로즈
SK 와이번스
kt 위즈
한화 이글스
KIA 타이거즈
삼성 라이온즈
롯데 자이언츠
NC 다이노스

이중 영문으로 시작하는 구단명만 선택해보겠습니다.

[글자][빈칸][글자]

먼저 구조는 글자 사이에 빈칸이 존재하고 앞글자가 영문으로 시작되는 텍스트만 선택하려합니다. 빈칸은 \s로 표현할 수 있습니다.

[a-zA-Z]+\s[가-힣]+

직접 a-zA-Z를 명시해주어도 되지만 a-zA-Z0–9범위를 나타내는\w를 사용할 수 있습니다. \w+\s[가-힣]+ 를 사용해도 결과는 동일합니다.

대문자 W는 반대로 A-Za-z0–9가 아닌 모든것을 선택합니다.

내용이 길어져 2편에서 이어나가겠습니다.

--

--

Harry The Great
해리의 유목코딩

Android & IOS Developer 😀 미디움 이외에 스니펫이나 디버그노트로 활용하는 https://www.harrymikoshi.com/ 블로그도 운영하고있습니다.