⚠ 이 강좌는 오토핫키 v2를 다룹니다
지금 보시는 강좌는 과거 오랜 시간동안 알려진 오토핫키(v1.1)의 차세대 버전인 오토핫키 v2를 다루고 있습니다.
만약 구버전인 '오토핫키 v1.1'의 강좌를 찾으신다면 프날 오토핫키 강좌(https://pnal.kr)를 봐주시면 되지만,
새로 오토핫키를 배우신다면 v2 버전을 배우시는 것을 강력히 추천드립니다.
87. 정규표현식 (정규식)
마지막 수정일: 2023-12-21
이번 강부터는 문자열 파싱 심화편입니다! 사실 파싱 작업은 여러 경험을 통해 체득하는 것이 효과 만점이기 때문에, 당장 이론이 이해되지 않더라도 필요한 프로그램을 제작하면서 자연스레 익히게 되는 경우가 많습니다. 그렇기 때문에 너무 스트레스 받지 마시고 천천히 배워봅시다.
딱 들어맞지 않는 문자열?
StrReplace
를 통해 전체 문자열에서 123
을 찾아 없애는 작업을 생각해봅시다.
간단하게 한 줄의 코드로 수행할 수 있다는 점은 이미 배워서 알고 있습니다.
... replacedString := StrReplace("가나다123", "123")
그런데 아래와 같은 경우를 생각해봅시다.
주어진 문자열이 무엇이든, 아무튼 세 자리 수를 제거하고 싶다!
위 예시에서 입력 문자열이 가나다123
이 아니라 가나다라456
과 같이 그때그때 바뀐다고 가정하면 우리가 지금까지 배운 방식으로는 힘듭니다.
물론 StrReplace
를 0부터 9까지 총 10개의 각 숫자에 대해 수행해주면 되긴 하지만... 코드가 너무 길어집니다.
우리는 1을 지워라, 123을 지워라...와 같이 정확한 명령으로 파싱 작업을 진행해왔습니다. 숫자를 지워라, 영문만 지워라...와 같이 추상적인 명령으로 파싱이 가능하면 참 좋을텐데 말이죠. 그런 '추상적인 명령'으로 파싱을 하기 위해 등장한게 정규표현식입니다.
정규표현식
정규표현식(Regular Expression)은 문자열에서 원하는 부분을 특정지어 표현할 수 있는 또다른 언어 체계입니다.
예를 들어서 연속된 숫자 세 개라는 뜻의 정규표현식을 이용하면, 오토핫키는 이를 알아듣고 해석하여 위의 예시와 같은 곤란한 상황을 타파할 수 있습니다. 오토핫키가 이해할 수 있는 문법에 맞춰서 Needle이 될 문자열을 특정지어주는 것이죠.
사진 1. 정규표현식의 의의Tip: 정규표현식을 나타내는 여러 대체어
정규표현식을 줄여서 정규식이라고도 하며, 영문 Regular Expression을 줄여서 RegEx 혹은 RegExp라고도 합니다.
패턴
정규식을 이용할 때 연속된 숫자 세 개라는 한글 문장을 그대로 쓰는식으로 프로그래밍할 순 없겠죠. 컴퓨터가 알아들을 수 있도록 정형화된 문자 체계를 이용해야 하는데, 그것이 바로 패턴입니다.
패턴은 정규표현식을 나타낼 때 쓰기로 약속한 기호와 그 나열을 말합니다. 만약 아무 숫자를 나타내는 패턴이 ★라면, ★★★라는 패턴으로 연속된 숫자 세 개를 표현할 수 있습니다. 다만 별(★)기호는 코딩할 때 쓰기 불편하므로 일반적으로 '패턴'으론 영문자와 자판에 있는 기호를 사용합니다.
따라서 패턴을 잘 익히면 기초적인 정규식을 사용하기 쉬워지고, 여러분의 파싱 실력도 한층 강력해질 것입니다.
Tip: 정규식과 패턴의 차이?
정규식과 패턴의 관계는 '한국어'와 '한글'의 관계와 같다고 보시면 됩니다. 정규식은 일종의 문법적 개념이고, 일종의 새로운 언어라고 보시면 됩니다. 그 언어를 표현하는데 쓰이는 문자가 패턴인 셈이죠.
따라서 패턴을 모르면 정규식을 쓸 수 없습니다. 다행히 몇가지의 큰 갈래를 제외하곤 각 언어의 패턴이 거의 일치해서, 한 번 정규식을 배워두면 다른 언어에서 쓰기 쉽습니다.
정규식은 전체 문자열 중 규칙에 맞게 원하는 문자열만 가져오게 도와주는 언어 체계이고, 이를 나타내는게 패턴이다!
정규식의 두 가지 임무
정규식으로 할 수 있는 것은 크게 검색과 치환입니다. 검색은 전체 문자열 중 일치하는 패턴이 있다면 그 위치를 알려주는 것이고, 치환은 일치하는 패턴을 다른 문자열로 바꾸는 것입니다.
InStr
과 StrReplace
의 역할과 같죠?
또, 검색과 치환을 이용하여 만들 수 있는 부가적인 기능으로 추출이 있습니다.
말 그대로 전체 텍스트 중 일부만 가져오는 것이죠.
이를 오토핫키로 구현하는 것은 나중으로 미루고, 일단 이번 강은 여기서 마치도록 하겠습니다.