정규표현식의 개념과 기초 문법

작성한지 10년이 지났는데도 notepad++ 관련한 키워드로 꾸준히 유입이 발생하고 있고,  그게 정규 표현식 관련한 글인데 별로 내용이 좋은 글이 아니다. (몇 가지 기초적인 문법만 요리책 식으로 나열해 놓은 거라…) 그래서 정규 표현식의 개념과 기초 문법 그리고 몇 가지 이 블로그에서 다루는 언어들에서 정규 표현식을 어떻게 쓰는지, 어떤 것들을 할 수 있는지 등에 대해서 알아볼 계획이다.

오늘은 그 첫 번째 순서로, 정규 표현식의 개념과 가장 기초가 되는 패턴 문법에 대해서 살펴보려고 한다.

정규 표현식의 개념

정규표현식은 줄여서 정규식(영어로는 Regular Expression이고 줄여서 Regex, Regexp 등으로 불린다.) 이라고도 하는데, 컴퓨터 과학의 정규언어로부터 유래한 것으로 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 형식언어이다.

일반적인 어휘를 써서 풀어보자면 어떤 텍스트 내에서 특정한 형태나 규칙을 가진 문자열을 찾기 위해 그 형태나 규칙을 나타내는 패턴을 정의하는 것이 정규 표현식이라고 이해하면 된다.

정규 표현식의 종류

정규 표현식은 다양한 분야에서 쓰이기 시작했는데 각 분야의 정규식은 서로 영향을 주고 받으면서 발전해서 지금에 이르렀다. 아니 왜 아름다운 역사 이야기를 갑자기 들먹이는 거냐면, 바로 정규식이 이렇게 쓰이는 곳이 다양한데, 하나의 통일된 표준이 아니라는 것이다.

유닉스 명령줄 도구들에서 사용하던 정규 표현식은 POSIX 표준에 편입되었다. 그리고 이후에 다시 POSIX 정규식은 POSIX BRE (POSIX 기본 정규식)와  POSIX ERE (POSIX 확장 정규식)으로 다른 버전이 나뉘게 된다. (grep에서 -e 스위치를 써서 확장 정규식을 쓰던 옵션이 바로 ERE를 쓴다는 의미이다.) 그외에 BRE를 기본 골격으로 한 vim 정규식이 있다. 역시 오랜 역사를 따라 개선과 확장을 거듭하면서 이는 POSIX 표준과는 좀 다른 규격으로 취급될 정도이다. 1:

그리고 문자열을 다루는데 특화된 스크립트 언어인 펄(perl)이 등장했다. 펄의 정규식 체계는 역시나 기본은 POSIX와 비슷한데, 엄청나게 많은 확장이 들어갔다. 이후 펄의 정규식은 PCRE라는 규격으로 정리되었으며, 이후 많은 프로그래밍 언어들이 이 규격을 차용하거나, 계승한다. 여기서 중요한 것은 “일부 차용”이다. 이 규격은 워낙 방대해서 PCRE를 그대로 가져다 쓰지 않는 이상, 구현할게 너무 많기 때문이다.

참고로 Cocoa에서는 ICU 표준의 정규식을 따른다. 이 라이브러리 역시 PCRE를 기반으로 하고 있으며, 유니코드 문자열에 대한 정규식 패턴 매칭을 수행하는 알고리듬이 구현되어 있다.

정규식 기본 문법

정규식 기분 문법은 크게 세 가지 정도로 나눌 수 있다.

  1. 패턴 그대로를 매칭하는 경우 : 편집기에서 “찾기” 기능을 통해서 특정 단어를 찾는 것 처럼, 단어 그대로를 패턴으로 사용하여 매치되는 영역을 찾는다.
  2. 메타문자 및 수량 한정자를 적용하는 경우 : 정규식 패턴에 쓰이는 문자중에는 특별한 의미를 가지는 메타 문자들이 있는데, 이들을 사용하여 보다 폭넓은 패턴에 매치할 수 있다.
  3. 그룹 및 look around 기능을 사용하는 경우 : 제법 고급 정규식이라 할 수 있는 부분으로, 패턴의 일부를 그룹으로 묶거나, 특정 패턴의 앞 뒤로 다른 패턴이 오는 조건을 더하는 경우이다.

정규식 메타 문자

메타 문자는 특정한 문자 혹은 문자 계열을 대신하여 표시하는 문자이다. 메타문자를 이용하면 특정한 규칙을 가진 여러 단어를 하나의 패턴으로 함축할 수 있다.

정규표현식의 개념과 기초 문법 더보기

음력날짜변환데이터

음력 날짜 변환하기

현재 공개된 “공식적인” 음력 변환 알고리듬은 존재하지 않는다. 한국 천문 연구원에서 계산한 결과가 우리가 사용하는 달력의 표준 음력이다. (개인적으로 만들어져서 배포되는 음력 변환 알고리듬이 좀 있기는 하나, 몇 년에 한 번 꼴로 오차가 있는 방식이라 크게 신뢰하기는 힘들다.) 한국 천문 연구원에서는 이 변환 알고리듬을 절대 공개하지 않고 있으며, 심지어 API로도 제공하지 않는다. ;;; 그런데 여기서 따로 변환기 페이지를 제공하고 있기는 하더라? 읭?

천문우주지식정보
http://astro.kasi.re.kr/Life/Knowledge/solar2lunar/convert_monthly.php

음력날짜변환데이터 더보기

정규식을 사용한 비밀번호 유효성 검사

정규식의 그룹 패턴 중에 Look-around라는 게 있는데, 특정 패턴의 앞/뒤로 만족하는 패턴이 있는 경우에만 해당 패턴을 만족시키는 케이스를 말한다. 예를 들어 apple(?=s)applesapple만 매칭되고 apple이나 appled는 매칭되지 않도록 하는 것이다. 이를 활용하여 비밀번호 유효성 검사에 정규식을 활용할 수 있다. 예를 들어,

  1. 6자리 이상
  2. 1개 이상의 영어 대문자
  3. 1개 이상의 숫자

라는 조건을 만족해야 한다면 저 전진 검색 패턴을 활용하면 된다.
정규식을 사용한 비밀번호 유효성 검사 더보기