정규식 1부터 100 - jeong-gyusig 1buteo 100

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

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

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

실습은 아톰(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편에서 이어나가겠습니다.

정규 표현식(정규식) 정보

애널리틱스는 정규 표현식을 지원하므로 보기 필터, 목표, 세그먼트, 잠재고객, 콘텐츠 그룹, 채널 그룹 등의 항목을 더 유연하게 정의할 수 있습니다.

애널리틱스의 맥락에서 정규 표현식은 애널리틱스 데이터의 패턴과 광범위하게 또는 세부적으로 일치하는 구체적인 문자 배열입니다.

예를 들어 보기 필터를 만들어 직원이 생성한 사이트 데이터를 제외하려면 정규 표현식을 사용하여 직원이 사용하는 전체 IP 주소 범위에서 모든 데이터를 제외할 수 있습니다. IP 주소의 범위가 198.51.100.1 - 198.51.100.25인 경우 25개의 IP 주소를 입력하는 대신 전체 주소 범위와 일치하는 123\.456\.789\.\d+ 같은 정규 표현식을 만들 수 있습니다.

또는 2개 도시의 캠페인 데이터만 포함하도록 보기 필터를 만들려면 San Francisco|New York(샌프란시스코 또는 뉴욕) 같은 정규 표현식을 만들 수 있습니다.

정규 표현식 메타 문자

와일드 카드

. 단일 문자(글자, 숫자 또는 기호)와 일치합니다. 1.은
10, 1A와 일치합니다.

1.1은
111, 1A1과 일치합니다.

? 앞의 문자와 0 또는 1회 일치합니다. 10?는
1, 10과 일치합니다.

+ 앞의 문자와 1회 이상 일치합니다. 10+는
10, 100과 일치합니다.

* 앞의 문자와 0회 이상 일치합니다. 1*는
1, 10과 일치합니다.

| OR 일치를 만듭니다.

표현식의 끝에 사용하지 마세요.

1|10은
1, 10과 일치합니다.

앵커

^ 문자열 앞 부분의 인접 문자와 일치합니다. ^10은
10, 100, 10x
와 일치합니다.
^10은
110, 110x
와 일치하지 않습니다.
$ 문자열 끝부분의 인접 문자와 일치합니다. 10$는
110, 1010과 일치합니다.

10$는
100, 10x와 일치하지 않습니다.

그룹

( ) 문자열에서 같은 순서로 포함된 문자와 일치합니다.

또한 기타 표현식을 그룹화하는 데 사용됩니다.

(10)은
10, 101, 1011과 일치합니다.

([0-9]|[a-z])는
모든 숫자 또는 소문자와 일치합니다.

[ ] 문자열에서 순서에 상관없이 포함된 문자와 일치합니다. [10]은
012, 120, 210과 일치합니다.

- 대괄호 안에 문자 범위를 만들면 문자열에서 모두 일치합니다. [0-9]는 0~9의 모든 숫자와 일치와 일치합니다.

이스케이프 문자

\ 인접 문자는 정규식 메타 문자가 아닌 문자 그대로 해석해야 합니다. \.은 인접한 점을 와일드 카드가 아닌 마침표 또는 소수점으로 해석해야 한다는 것을 나타냅니다.

216\.239\.32\.34 matches
216.239.32.34

정규 표현식을 간결하게 유지합니다. 정규 표현식이 간단하면 다른 사용자가 손쉽게 이해하고 수정할 수 있습니다.

문자를 문자 그대로 해석해야 하면 백슬래시(\)를 사용하여 정규 표현식 메타 문자를 이스케이프 처리합니다. 예를 들어 IP 주소에서 소수점으로 점을 사용하면 점을 백슬래시(\.)로 이스케이프 처리하세요. 그래야 점이 와일드 카드로 해석되지 않습니다.

정규 표현식은 정규 표현식 메타 문자를 포함할 필요는 없습니다. 예를 들어 Country matches regex India(국가와 정규 표현식 인도 일치)라는 필터 정의로 인도에서 비롯된 모든 데이터를 위한 세그먼트를 만들 수 있습니다.

정규 표현식은 가능한 한 모든 항목과 일치하려는 속성을 가지고 있으므로 지정하지 않으면 사용자가 지정한 것뿐만 아니라 모든 인접 문자와도 일치하려고 합니다. 예를 들어 'site'는 'site'가 포함된 모든 문자열(예: mysite, yoursite, theirsite, parasite)과 일치합니다. 정확하게 일치하려면 이에 맞게 정규식을 구성하세요. 예를 들어 'site' 문자열과만 일치하려면 'site' 문자 앞, 뒤 모두에 ^site$ 같이 정규식을 구성합니다.

도움이 되었나요?

어떻게 하면 개선할 수 있을까요?