이번엔 정규식에서 정말 자주 쓰는 문자 클래스(대괄호 [ ])를 배워 볼게요. '여러 후보 중에 하나면 통과'시키고 싶을 때 쓰는 아주 유용한 도구예요. 예를 들어 'a나 e 둘 중 하나' 같은 걸 표현할 수 있어요. 초보가 헷갈리기 쉬운 함정도 하나 있는데, 그것까지 확실히 짚어드릴게요. 이 함정만 넘으면 정규식이 한결 편해질 거예요.
04.1 문자 클래스가 뭐예요?
문자 클래스는 대괄호 [ ] 안에 글자들을 넣어 두고, '이 중에 하나면 통과'라고 말하는 방법이에요. 예를 들어 [ae]라고 적으면 'a 또는 e 중 한 글자'라는 뜻이 돼요. 대괄호 안에 글자를 나열하면, 그 나열이 곧 '이 중 아무거나 하나'가 되는 거죠. '이거 아니면 저거' 하는 선택지를 한 자리에 몰아 넣는 거라고 보면 돼요.
여기서 꼭 기억할 점이 있어요. 대괄호 하나는 글자 한 개에만 대응해요. 아무리 안에 글자를 많이 넣어도, [ ] 하나는 딱 한 자리를 담당해요. 후보가 열 개든 스무 개든, 실제로 매치되는 건 그중 딱 한 글자뿐이라는 뜻이에요. 이걸 놓치면 뒤에 나올 함정에 걸리기 쉬우니 미리 눈도장 찍어 두세요.
04.2 대괄호 안 글자 순서는 상관있어요?
궁금해하실 것 같아서 미리 알려드려요. 대괄호 안에 넣는 글자들의 순서는 전혀 상관없어요. [ae]라고 쓰든 [ea]라고 쓰든 뜻은 똑같아요. 둘 다 'a 또는 e 중 한 글자'거든요. 대괄호는 '이 중에 하나면 통과'라는 뜻이라, 나열한 순서는 결과에 아무 영향을 안 줘요.
그래서 후보가 여러 개일 때는 읽기 편한 순서로 적으면 돼요. 예를 들어 모음을 넣을 때 [aeiou]처럼 익숙한 순서로 적으면 나중에 봐도 한눈에 들어오죠. 이런 작은 습관이 패턴을 오래 관리할 때 은근히 도움이 된답니다.
04.3 철자가 두 가지인 단어를 한 번에
실전 예로 가 볼게요. 같은 뜻인데 미국식은 gray, 영국식은 grey로 써요. 가운데 글자만 a냐 e냐로 갈리죠? 이럴 때 문자 클래스가 딱이에요.
패턴: gr[ae]y
대상: gray grey groy
매치: ['gray', 'grey']
gray와 grey가 둘 다 잡혔죠? [ae]가 'a 또는 e 중 하나'를 맡아 준 덕분이에요. 반면 groy는 가운데가 o라서 빠졌어요. o는 후보(a, e)에 없으니까요. 이렇게 '거의 같은데 한 글자만 다른' 경우를 한 패턴으로 깔끔하게 처리할 수 있어요. 두 단어를 따로따로 두 번 찾을 필요 없이, 대괄호 한 방으로 끝나니 참 편하죠?
04.4 단어 속 모음만 골라내기
이번엔 단어에서 모음(a, e, i, o, u)이 어디 있는지 전부 찾아볼게요. 후보를 다섯 개 다 넣으면 돼요.
패턴: [aeiou]
대상: regex
매치: ['e', 'e']
regex라는 단어에서 모음 e 두 개가 각각 잡혔어요. 문자 클래스는 글자를 한 개씩 훑으면서, 후보에 해당하는 글자를 하나하나 따로 잡아요. r, g, x는 모음이 아니라 건너뛰고, e만 콕콕 집어낸 거죠. 결과가 'ee'처럼 붙어서 하나로 나오는 게 아니라, e 하나하나가 따로 잡힌다는 점을 눈여겨보세요. '한 글자씩, 해당하면 각각' 이 느낌을 잘 잡아 두면 좋아요.
04.5 고정된 부분과 갈리는 부분 조합하기
문자 클래스는 고정된 글자랑 섞어 쓸 때 진가를 발휘해요. 예를 들어 호칭 Mr(남성)와 Ms(여성)를 한 번에 잡고 싶어요. 앞의 M은 고정이고 뒤만 r이냐 s냐로 갈리죠.
패턴: M[rs]
대상: Mr Ms Mx
매치: ['Mr', 'Ms']
고정된 M 뒤에 [rs](r 또는 s)를 붙였더니 Mr과 Ms가 잡혔어요. Mx는 x가 후보에 없어서 빠졌고요. 이렇게 '변하지 않는 부분'은 그냥 글자로 적고 '갈리는 부분'만 대괄호로 묶으면, 여러 경우를 한 패턴에 담을 수 있어요. 글자를 그대로 적는 리터럴(고정 글자)과 문자 클래스(갈리는 자리)를 함께 쓴 거예요. 실무에서 정말 자주 나오는 조합이니 손에 익혀 두세요.
04.6 대괄호 안에서는 점도 평범해져요
재밌는 사실 하나 알려드릴게요. 정규식에서 점(.)은 '아무 글자나'라는 특수문자죠? 그런데 대괄호 안에 넣으면 그 특수 능력이 사라지고 그냥 평범한 마침표가 돼요. 문장에서 진짜 마침표만 찾아볼게요.
패턴: [.]
대상: 3.14 a b.
매치: ['.', '.']
[.]는 역슬래시로 이스케이프한 \.와 똑같은 뜻이에요. 둘 다 '진짜 점 한 개'를 찾아요. 대괄호 안의 점은 특수 능력이 없으니, 이스케이프(역슬래시)를 안 붙여도 그냥 마침표가 되는 거죠. 사실 초보에게는 \.보다 [.]가 더 눈에 잘 들어올 때가 많아요. '대괄호 안이니까 그냥 점이구나' 하고 바로 읽히거든요. 편한 쪽을 골라 쓰시면 돼요.
04.7 [cat]은 단어 cat이 아니에요!
자, 이제 앞서 말씀드린 함정이에요. 이게 초보가 가장 많이 하는 오해라서 특별히 힘줘서 알려드릴게요. [cat]이라고 적으면 단어 cat을 찾을 것 같죠? 절대 아니에요!
패턴: [cat]
대상: cat
매치: ['c', 'a', 't']
보세요, 단어 cat이 통째로 잡히는 게 아니라 c, a, t가 각각 따로 잡혔어요! 왜냐하면 [cat]은 'c 또는 a 또는 t 중 한 글자'라는 뜻이거든요. 앞에서 '대괄호 하나는 글자 한 개'라고 몇 번이나 강조했던 말, 기억나시죠? 바로 이 부분 때문이에요.
단어 cat을 찾고 싶으면 대괄호 없이 그냥 cat이라고 리터럴로 적어야 해요. 대괄호는 '여러 후보 중 한 자리'를 표현할 때만 쓴다는 걸 확실히 구분해 두세요. [ ]가 보이면 머릿속에서 '아, 여기 한 글자 자리에 후보들이 모여 있구나'라고 바꿔 읽는 습관을 들이면 좋아요. 이 하나만 제대로 잡아도 정규식 실력이 한 단계 올라간 거예요.
04.8 문자 클래스는 이럴 때 편해요
문자 클래스가 빛나는 순간을 정리해 볼게요. '철자가 몇 가지로 갈리는 단어'(gray와 grey처럼), '정해진 후보 글자들 중 하나'(호칭 뒤의 r이나 s처럼), '특정 종류의 글자 한 개'(모음 같은 것)를 찾을 때 아주 유용해요. 하나하나 따로 찾아 여러 번 돌릴 일을, 대괄호 한 번으로 끝낼 수 있으니까요.
쓰다 보면 '아, 이 자리에 올 수 있는 글자가 몇 개로 정해져 있네?' 싶은 순간이 자꾸 보일 거예요. 그때가 바로 문자 클래스를 꺼낼 타이밍이에요. 오늘 배운 [ ] 하나만 잘 써도, 표현할 수 있는 패턴의 폭이 훌쩍 넓어진답니다.
04.9 오늘 배운 내용 정리
오늘 배운 문자 클래스 [ ]를 정리할게요. 대괄호 안에 글자들을 넣으면 '이 중 하나면 통과'라는 뜻이고, [ae]는 'a 또는 e'예요. 순서는 상관없어서 [ae]와 [ea]가 같고요. 고정 글자와 섞어서 gr[ae]y, M[rs]처럼 쓰면 여러 경우를 한 번에 잡을 수 있어요.
대괄호 안에서는 점 같은 특수문자도 평범해져서 [.]가 \.와 같은 뜻이 되고요. 그리고 가장 중요한 함정! 대괄호 하나는 언제나 글자 한 개라서, [cat]은 단어 cat이 아니라 'c 또는 a 또는 t 한 글자'예요. 그리고 문자 클래스는 '철자가 갈리는 단어'나 '후보가 정해진 한 자리'를 찾을 때 특히 편하다는 것도 함께 기억해 두세요. 이 점만 확실히 잡으면 문자 클래스는 완전히 여러분 것이에요. 오늘도 여기까지 따라오시느라 정말 수고 많으셨어요!