프날 오토핫키 강좌  v2

⚠ 이 강좌는 오토핫키 v2를 다룹니다

지금 보시는 강좌는 과거 오랜 시간동안 알려진 오토핫키(v1.1)의 차세대 버전인 오토핫키 v2를 다루고 있습니다.
만약 구버전인 '오토핫키 v1.1'의 강좌를 찾으신다면 프날 오토핫키 강좌(https://pnal.kr)를 봐주시면 되지만, 새로 오토핫키를 배우신다면 v2 버전을 배우시는 것을 강력히 추천드립니다.

88. 패턴의 사용


앞서, 정규식에서 쓸 수 있는 문자 체계를 '패턴'이라고 했는데, 따라서 패턴을 잘 익히면 정규식을 어렵지 않게 사용할 수 있습니다. 이곳 기초 강좌에선 정규식을 완전히 익히진 못하겠지만, 자주 쓰이는 패턴 문자를 배우고 연습해보며 아주 기초적인 정규식을 사용해보도록 하겠습니다.

패턴이 일치한다?

모든 것에 앞서, 앞으로 '패턴이 일치한다', '일치하는 패턴', '매칭되었다'와 같은 표현을 쓸 것인데, 이는 전체 문자열에서 패턴이 의미하는 문자열이 존재한다는 것을 의미합니다.

예를 들어서, 아무 단일 숫자를 의미하는 패턴 이 있을 때, 이 패턴은 가나다123이라는 문자열엔 총 세 군데에서 매칭됩니다. '1'에서 한 번, '2'에서 한 번, '3'에서 한 번 말이죠.

그렇다면 ★★라는 패턴은 총 몇 번, 어디서 매칭될까요? 바로 '12'에서 한 번, '23'에서 한 번. 총 두 번 매칭됩니다.

이렇게 '패턴이 문자열과 일치하는 경우'를 '매칭되었다'라고 표현합니다.

선행 문자

앞으로 몇 가지 패턴 문자를 배울텐데, '선행 문자'라는 개념을 언급할 것입니다. '선행 문자'는 어떤 패턴 문자의 앞에 있는 단일 패턴 문자를 의미합니다. 예를 들어서, 아래와 같은 패턴이 있다고 가정합시다.

.+가나\d*

+의 선행 문자는 무엇인가요? 네, .입니다. 의 선행 문자는요? +겠죠.

*의 선행 문자는 d라고 생각하기 쉽지만, 사실 \d입니다. 앞으로 배우겠지만 \d 자체가 하나의 패턴 문자이기 때문에, 둘은 떨어질 수 없습니다. 이러한 개념은 바로 뒤에서 배우게 됩니다.

패턴 문자

몇가지 기초적인 패턴 문자를, 실제 문자열에서 어떻게 매칭되는지 예를 살펴보며 익혀보겠습니다.

1. 아무 문자

패턴 문자로 사용되지 않는 문자열은 '문자열 그대로'와 매칭됩니다. 따라서, App 패턴은 Apple문자열의 앞부분을 매칭합니다.

Apple

아무 문자 패턴이 매칭되는 곳

2. .

.은 'Dot' 패턴이라고 읽으며, "아무 문자"를 의미합니다. Apple이라는 문자열에 .라는 패턴은 각 글자마다 총 5군데에서 매칭됩니다.

A p p l e

Dot 패턴이 매칭되는 곳

3. *

*는 'Star' 패턴 또는 'Asterisk' 패턴이라고 읽으며, "선행 문자의 0개 이상 반복"을 의미합니다. 예를 들어서, Apple이라는 문자열에서 p*라는 패턴은 pp와 매칭됩니다. 사실 Star 패턴은 선행 문자가 '0개 이상', 즉 0개 있는 경우도 매칭하기 때문에, p가 없는 문자와도 매칭됩니다. 따라서 Apple에선 A의 앞에서 빈 문자열에 한 번, pp에서 한 번, l의 앞에서 빈 문자열에 한 번, e의 앞에서 빈 문자열에 한 번... 총 네 군데에서 매칭됩니다.

 A p p  l e

p-Star 패턴이 매칭되는 곳

어렵죠? 실제로는 .* 형태의 Dot-Star 패턴을 주로 사용합니다. 이는 '아무 문자의 0개 이상 반복', 즉 정말로 '아무 문자 전부'를 의미합니다. 어느 문자열이든 .* 패턴에 의해 전체가 매칭되죠.

Apple

Dot-Star 패턴이 매칭되는 곳

위와 같이 패턴 하나로 '전부'를 매칭시킬 수 있고, 아래와 같이 특정 글자 사이의 모든 문자를 매칭 시킬수도 있습니다.

문자열: 가나다라마바사아자
패턴: 나.*바

나다라마바사아자

Dot-Star 패턴이 매칭되는 곳

위의 경우엔 Dot-Star 패턴에 매칭되는 부분은 '다라마'이고, 전체 패턴에 매칭되는 부분은 '나다라마바'입니다. 그야, Dot-Star 패턴은 '아무 문자 전부'를 의미하고, '나'와 '바'를 포함하여 그 사이의 전부를 매칭하니까요.

4. +

+는 'Plus' 패턴이라고 읽고, "선행 문자의 1개 이상 반복"을 의미합니다. *와 유사하지만 선행 문자가 1개는 있어야 매칭된다는 점이 다릅니다.

Apple에서 p+패턴은 단 한 곳에서만 일치하게 되죠.

Apple

5. ?

? 패턴은 '물음표' 패턴 또는 'Question mark' 패턴이라고 읽으며, 선행 문자를 옵션화 시켜주는 역할을 합니다. 이 말은, 선행 문자가 있든 없든 나머지 패턴만으로 매칭되도록 한다는 뜻입니다.

문자열: Colour and Color
패턴: Colou?r

선행 문자 u가 옵션화된 위와 같은 상황에선, 아래와 같이 두 군데에서 패턴 매칭이 이루어집니다.

Colour and Color

6. |

| 패턴은 'Bar' 패턴이라고 읽으며, Bar 선택지 중 하나만 일치하면 매칭되는 패턴입니다.

문자열: Python is easy. AHK is easy too.
패턴: Python|AHK

위와 같은 경우엔 아래와 같이 'Python', 'AHK' 총 두 군데에서 매칭됩니다. 논리 연산자 중 '또는'을 의미하는 ||와 유사한 쓰임새죠?

Python is easy. AHK is easy too.

7. (, )

() 같은 '괄호'로 '부패턴(Subpattern)'을 만들 수 있습니다. 부패턴은 향후 배울 RegExMatch라는 함수에 쓰이기도 하고, 또 단순히 '선행 문자'를 그룹화시켜주기도 합니다. 즉 (\d-)+라는 패턴은 +의 선행 문자가 - 뿐만 아니라 \d-가 되도록 해줍니다.

수학에서의 쓰임과 같이 패턴끼리 먼저 연산하는 부분을 지정해주기도 하는데, 예를 들어서 gr(e|a)y 같이 Bar 패턴과 결합하는 경우를 상상해볼 수 있습니다. 이 경우 greygray 모두에 매칭되겠죠.

8. [, ]

[]로 만드는 대괄호쌍 안에 적은 문자는 '단일 문자들'을 의미합니다. 예를 들어서, [가나다]는 '가', '나', '다'. 총 세 개의 문자와 각각 매칭됩니다. "나다, 당장 다 나가!" 라는 문장에서 [가나다] 패턴은 아래와 같이 '가', '나', '다' 각각에 매칭됩니다.

'나다 다 나가'에 형광펜이 칠해져있는 모습 사진 7. 대괄호 패턴(문자 클래스라고 합니다.)이 매칭되는 곳

나다, 당장 나가!

대괄호 안의 문자 사이에 -를 넣으면 '매칭할 문자 범위'를 지정할 수 있습니다. 예를 들어서, [A-Z]는 알파벳 A부터 Z까지를 매칭합니다. (물론, 대소문자를 구분하기 때문에 a부터 z는 매칭되지 않습니다.) 비슷하게 [0-9][a-z]으로 쓸 수도 있고, 모두 합쳐서 [0-9A-Za-z]처럼 써서 모든 영문자와 숫자를 매칭시킬수도 있습니다.

참고로, 이 '범위'는 유니코드 순서 기준으로 정해지기 때문에, '모든 완성된 한글' 범위를 매칭시키고 싶다면 [가-힣]을 사용하면 됩니다.

또한, 대괄호의 시작 부분에 ^ 기호를 넣어서 '해당하는 글자가 아닌' 문자와 매칭할 수 있습니다. 즉, 기존 대괄호 패턴의 정반대 역할을 합니다. 따라서 [^0-9]는 숫자를 제외한 모든 문자와 매칭됩니다.

9. \d, \w, \s

각각 '아무 숫자', '아무 글자', '아무 공백문자'를 의미합니다. 정확히는, \d[0-9] 패턴과 정확히 일치하고, \w[A-Za-z0-9_] 패턴과 일치하며, \s[`t`r`n ]과 일치합니다.

Tip: 패턴 이스케이프

위와 같은 문자를 '있는 그대로' 해석하려면 역시 이스케이프가 필요할 것입니다. 정규식의 이스케이프는 오토핫키의 `를 쓰지 않고, 역슬래시(\)를 사용합니다. 이스케이프가 필요한 문자는 \.*?+[{|()^$입니다.

따라서, Dot 패턴이 아닌 있는 그대로의 '마침표'를 패턴으로 쓰려면 \.를 쓰면 되는 것이죠.

너무 어려워요!

모든 패턴을 지금 당장 외울 필요는 없습니다. 가장 많이 쓰이는 Dot-star 패턴만 익히고, 실제 프로그래밍시 그때그때 필요한 패턴을 찾아보는 것이 좋습니다. 애초에 이곳에 모든 패턴을 적은 것도 아닙니다. 모든 패턴을 자세히 알고 싶다면 오토핫키 공식 문서의 RegEx: Quick Reference 문서를 참고하세요.

그래도 조금이라도 패턴을 익히는데 도움을 드리고 싶어 아래와 같이 연습 문제를 조금 준비해 보았습니다.

[점검 질문] 주어진 문장에 주어진 패턴이 어떻게 매칭되는지, 매칭되는 부분을 전부 찾아보세요.
정규식 패턴에 익숙해지기 위해 컴퓨터 없이 풀 수 있는 문제를 내보겠습니다.

예) 가나다123 (패턴: .*)
가나다123
1. 010-0000-0000 (패턴: \d+)
정답 펼치기/접기 010-0000-0000
2. https://ahkv2.pnal.dev & http://ahkv2.pnal.dev (패턴: https?)
정답 펼치기/접기 https://ahkv2.pnal.dev & http://ahkv2.pnal.dev
3. 팀장님, 퇴근하겠습니다. (패턴: [^가-힣])
정답 펼치기/접기 팀장님, 퇴근하겠습니다.
4. 123-45-678-90-1-234 (패턴: \d\d\d)
정답 펼치기/접기 123-45-678-90-1-234
5. contact@example.org (패턴: @.*\.)
정답 펼치기/접기 contact@example.org
질문하러 가기