정규표현식 006. 메타문자 1

조회 수 9057 추천 수 0 2012.01.07 18:05:22

결국 정규식을 익힌다는 것은 기본적으로 메타문자들을 잘 다룬다는 것을 의미합니다. 물론 상급 단계로 가면 창의력과 논리력 등을 필요로 하긴 합니다만. 암튼 메타문자들을 공부하기로 하겠습니다.


지난 회의 마침표에 이어 대괄호([])입니다. 대괄호는 문자의 집합을 정의하는데 사용됩니다. 백마디 설명보다는 역시 한마디 예제겠지요?


abc[234]def


위의 정규식은 abc2def와 매치됩니다. 또 abc3def, abc4def와도 매치됩니다. 이것이 다입니다. 더 이상 매치되는 문자 조합은 없습니다.


[234]는 2나 3 혹은 4라는 의미입니다. 2, 3, 4로 일련번호를 이루고 있죠? 이런 경우에는 [2-4]로 표기할 수도 있습니다. [abcdef]도 마찬가지입니다. [a-f]로 줄여서 쓸 수 있습니다. 그러니까 [a-z]라고 쓰면 영문 소문자가 됩니다. 아, 참 중요한 걸 빼먹었네요. 정규식에서는 영문 대소문자를 구분합니다. 즉, H와 h를 서로 다른 문자로 취급합니다. 메타문자들도 마찬가지입니다. 가령 \d는 숫자 한 글자라는 의미입니다. 반면 대문자를 쓴 \D는 숫자가 아닌 한 글자가 됩니다. 이스케이프 문자에 있어서는 대문자와 소문자가 서로 반대되는 의미를 가질 때가 많습니다.


지금까지 설명한 예만 보면 대괄호 안에 들어가는 글자들은 항상 하나의 집합만 이루는 것 같죠? 하지만 그렇지 않습니다. 몇 개라도 집합을 이룰 수 있습니다. 다만 어느 경우라도 결국은 한 글자만 들어갈 수 있습니다. 가령,


[A-Z0-9a-z]


위의 식은 영문 대문자와 숫자, 영문 소문자 가운데 한 글자라는 의미입니다.


아, 그리고 또 하나 대괄호 안에서 하이픈(-)은 특별한 의미로 쓰이고 있죠? 범위를 지정하는 용도로 말입니다. 그렇다면 이런 경우는 어떻게 할까요? a거나 v거나 하이픈인 글자를 찾으려면... 이럴 때 쓰는 게 바로 이스케이프 문자입니다. 따라서 [av\-]로 표현하면 됩니다.


반면 대괄호 밖에서의 하이픈은 그냥 하이픈일 뿐입니다. 이처럼 대괄호 안에서만 특별한 의미로 쓰이는 글자로는 캐럿(^)도 있습니다. 이는 여집합을 의미합니다. 오잉? 수학 시간도 아닌데 왠 여집합? 에궁, 그래도 기억은 나시는 모양입니다. 바로 수학 시간을 떠올리시는 걸 보니 말입니다. 여집합은 빼기를 생각하면 됩니다. 역시 예제를 들어야겠지요.


[^37A]


위는 3과 7과 A라는 글자들을 제외한 한 글자를 의미합니다. 4, 5, B, P 등등이 여기에 해당되겠지요.


잠깐, 머리도 좀 식힐 겸 에디터 얘기를 해보죠. 첫 회에서 울트라 에디트를 언급했었는데 여기에 들어 있는 정규식 엔진은 생각보다 상당히 강력하더군요. 컨트롤+F 키를 눌러서 검색창을 연뒤 옵션에 보면 정규식이라는 체크박스가 있습니다. 또 그 밑에 3가지의 정규식 엔진이 있는데 이중 펄 방식이 가장 널리 쓰입니다. 바로 아래 유닉스도 있지만 일반적은 아닙니다.


여기서 돌발 퀴즈. 정규식은 주로 어느 쪽에서 발전되어온 것일까요? 1번 마이크로소프트, 2번 유닉스. 항상 긴 게 답이라고요? 틀리셨네요. 푹~ 마이크로소프트 같은 회사가 그런 걸 발전시켜왔을 리가 없잖아요. MS는 도스부터 시작해서 엑셀 등등 어느것 하나 자기네가 개발한 게 별로 없어요. 항상 넘들 거를 사다가 상업적으로 잘 다듬고 포장해서 팔아왔을 뿐이죠. 그러다 보니 잘 하는 거라곤 장사 하나밖에 없구요.


자바, 이클립스, mySQL, 리눅스, php 같은 거 보세요. 전부 오픈 소스들이죠. MS에서는 사용자들을 위해 오픈 소스 프로젝트 한 게 단 하나도 없습니다. 기술력도 빈곤하기 짝이 없죠. 과거부터 MS-DOS보다는 DR-DOS, MS-C보다는 터보-C나 볼랜드-C, 익스플로러보다는 넷스케이프 등이 항상 기술적으로 더 앞서 있었잖아요. 현재만 해도 익스플로러가 기술적으로는 꼴찌고요. 파이어폭스, 크롬플러스, 사파리, 오페라 등 어떤 웹브라우저도 익스플로러보다는 한수 위이니까요.


기술력뿐만이 아니라 창의성, 시장을 선도하는 모험정신 등 어느것 하나도 마이크로소프트에는 보이질 않습니다. 오직 경쟁 제품들을 잡아먹고 시장을 싹쓸이하는 기술 하나만 돋보일 뿐이에요. 현재 지탄의 대상이 되고 있는 액티브-X만 해도 마이크로소프트가 웹브라우저 시장을 독식하고 싶은 더러운 마음에서 만들어낸 욕심의 산물이고요. 오죽하면 스티브 잡스가 윈도우즈라는 저열한 제품에 그의 맥OS가 시장에서 밀리는 상황을 그토록 안타까워했겠습니까.


게다가 뭔 놈의 소프트웨어를 그리 비싸게 팔아먹는지. 운영체제 하나에 35만원이 뭡니까. 물론 이것도 개발툴에 비하면 새발의 피지만요. 결국 우리 모두는 빌 게이츠를 부자 만들어주는 봉이라니까요. 하기사 뭐 마이크로소프트 뿐이겠습니까. 우리나라에도 많죠. 대기업이 자기 혼자 만들어서 키운 줄 알고 어떻게든 지 자식, 그것도 경영능력이 꽝이라고 이미 입증된 무능력자한테 넘겨주려고 광분하는 꼴을 보면 참 열불이 납니다. 온갖 편법과 불법, 비리는 독판 저지르면서 “국민들이 정직했으면 좋겠다”는 헛소리나 해대고... 빌 게이츠는 그래도 이 사람보다는 좀 낫다고 해야 할까요?


원래 정규식이라는 건 유닉스에서 죽 발전되어 왔습니다. 리눅스에도 들어 있는 grep 또는 여기서 더 발전된(enhanced된) egrep 같은 유틸리티들이 정규식을 지원하고 있죠. 현재 기준으로 정규식을 지원하는 시스템을 보면 c나 c++ 컴파일러들의 대부분, 자바, 자바스크립트, php, asp, 닷넷 등입니다. 다만 오리지널 asp는 지원하긴 하되 영 엉성합니다. 이거 누가 만들었게요? 마이크로소프트입니다. 꺼이꺼이, 왜 나만 미워해!


에궁, 각설하고. 울트라 에디트 얘기를 왜 꺼냈느냐면요 정규식을 아무리 배워본들 실제 연습이 없으면 꽝이잖아요. 연습을 해보자면 뭔가 도구가 필요한데 만약 프로그래머가 아니라면 php나 c, 자바 같은 걸 쓸 수가 없을테니 결국 울트라 에디트가 답이기 때문이랍니다. 사용하기도 아주 쉽죠. 에디터 창에 텍스트를 잔뜩 입력한 뒤 정규식으로 검색해 보면 그만이니까요.


물론 수준이 좀더 올라가면 자바스크립트 등을 이용해 한층 정교하게 프로그래밍을 해가면서 정규식을 활용할 수도 있을테고요. 사실 정규식이 제대로 능력을 발휘하는 분야도 바로 프로그래밍입니다. 가령 웹 사이트에서 회원 가입을 받을 때 사용자가 입력한 이메일 주소의 타당성 검사 같은 경우죠. 이때는 서버의 부하를 줄이기 위해 자바스크립트로 하게 됩니다.


그런데 좀 슬프게도 언어에 따라 정규식 문법이 조금씩 달라진답니다. 좀이 아니라 많이 슬픈가요? 아무튼 자바스크립트에서는 멀쩡히 잘 돌아가던 정규식이 php로 옮겨놓으면 먹통이 된다는... 에효~ 오늘은 저도 이만 먹통이 될랍니다.


List of Articles
번호 제목 글쓴이 날짜 조회 수sort
29 정규표현식 019. IP 주소 유효성 검사 1 마라톤맨 2012-02-02 98653
28 정규표현식 023. 정규식의 옵션과 여러 정규식 엔진들 마라톤맨 2012-02-15 68811
27 정규표현식 025. 자바스크립트의 정규식 1 마라톤맨 2012-02-22 31746
26 정규표현식 022. 드라이브명과 디렉토리, 파일명 분리 2 마라톤맨 2012-02-13 23865
25 정규표현식 011. 검색 문자 개수 지정하기 머니북 2012-01-12 21478
24 정규표현식 029. 자바스크립트의 정규식 5 마라톤맨 2012-03-28 15641
23 정규표현식 021. 드라이브명과 디렉토리, 파일명 분리 1 마라톤맨 2012-02-08 13646
22 정규표현식 010. 웹 서버 설정에도 필요 머니북 2012-01-11 13405
21 정규표현식 014. 최대 매치와 최소 매치 1 마라톤맨 2012-01-18 12616
20 정규표현식 007. 메타문자 2 마라톤맨 2012-01-08 12452
19 정규표현식 026. 자바스크립트의 정규식 2 마라톤맨 2012-02-27 11151
18 정규표현식 020. IP 주소 유효성 검사 2 마라톤맨 2012-02-06 10843
17 정규표현식 016. 하위 표현식 1 마라톤맨 2012-01-25 10294
16 정규표현식 024. 숙제와 답 마라톤맨 2012-02-17 10165
15 정규표현식 018. 하위 표현식 3 마라톤맨 2012-01-30 10110
14 정규표현식 012. 검색할 위치 1 마라톤맨 2012-01-13 9496
13 정규표현식 027. 자바스크립트의 정규식 3 마라톤맨 2012-03-02 9424
12 정규표현식 028. 자바스크립트의 정규식 4 마라톤맨 2012-03-09 9225
11 정규표현식 015. 최대 매치와 최소 매치 2 마라톤맨 2012-01-20 9196
10 정규표현식 013. 검색할 위치 2 마라톤맨 2012-01-16 9076