다음은 얼마전에 발간한 "서브라임 텍스트 - 프로그래머와 디자이너가 선택한 텍스트 에디터" 서적의 일부입니다.
정규 표현식(Regular Expression)이란 불규칙적으로 반복되는 패턴에서 일정한 규칙(Regular)을 만드는 표현식을 말합니다. 프로그래밍 작업뿐 아니라 일반적인 문서 작업에서도 응용할 수 있는 분야입니다. 우선 정규표현식이 어떻게 생겼는지 보겠습니다.
(?:Sw|P)i(?:tch|s{2})\s(?:it\s)?of{2}!
처음 보면 무슨 암호처럼 보이고 무엇을 의미하는지 전혀 알 수 없습니다. 정규 표현식에서의 일부 글자와 기호는 특정한 작업을 하게 돼 있습니다. 따라서 일반 글자에 이러한 특수 문자나 기호가 사용되어 암호처럼 느껴지지만 그 역할을 알고 나면 한눈에 무엇을 의미하는지 알 수 있습니다. 그렇기 때문에 정규 표현식을 처음 대하면 어렵게 생각되지만 사용하다 보면 생각보다 어렵지 않다는 사실을 알 수 있습니다.
[그림1-127 위키피디어의 정규 표현식 예제]
I watch three climb before it's my turn. It's a tough one. The guy before me tries twice. He falls twice. After the last one, he comes down. He's finished for the day. It's my turn. My buddy says "good luck!" to me. I noticed a bit of a problem. There's an outcrop on this one. It's about halfway up the wall. It's not a
위 문장은 위키피디어의 정규 표현식 페이지 에 나오는 예제입니다. 단어와 단어 사이에 공백이 두 개 이상인 곳이 여러 곳에 나타나는데, 위키피디어에서는 각 문장의 끝과 시작 사이에 공백이 두 곳 이상 있는 경우는 선택하고 공백이 하나 있으면 제외하는 방법을 보여줍니다. 위 문단을 서브라임 텍스트로 옮겨서 찾기 및 치환으로 나타내면 다음과 같습니다.
[그림1-128 문장과 정규 표현식을 서브라임 텍스트에 입력]
정규 표현식 버튼이 눌린 상태에서 Find What에 아래의 정규 표현식을 입력하면 각 문장 사이의 공백을 선택합니다. 특히 문장 사이가 아닌 단어 사이(파란색 박스 부분)는 선택되지 않습니다. 이처럼 정규 표현식을 이용하면 원하는 곳을 선택해 원하는 글자로 치환할 수 있습니다. Replace With에 공백 한 칸을 입력하고 Replace All 버튼을 클릭하면 선택된 부분은 모두 공백 한 칸으로 치환됩니다.
(?<=\.) {2,}(?=[A-Z])
[그림1-129 스페이스 2개 이상 일치]
먼저 찾기 입력란에 스페이스와 {2,}를 입력하면 위와 같이 공백이 두 개 이상인 곳이 선택됩니다. 중괄호 안의 앞의 숫자는 최소를 의미하고 뒤의 숫자는 최대를 의미하지만 생략했기 때문에 무한대를 의미합니다. 위 그림에서는 공백이 희미한 점으로 표시되는데, 이렇게 하려면 사용자 설정 파일에서 "draw_white_space": "all"을 설정하면 됩니다.
[그림1-130 마침표를 본래의 기능으로 전환]
입력란에서 공백 앞에 마침표를 입력하면 공백이 두 곳 이상 있는 곳의 글자까지 선택됩니다. 정규 표현식에서 마침표는 특수한 기능을 하며 하나의 글자를 선택합니다. 글자나 기호, 공백 등 모든 것이 해당됩니다. 따라서 문장 부호의 마침표뿐만 아니라 문장 내 단어의 마지막 글자도 선택됐습니다.
마침표를 특수 기능이 아닌 마침표 자체를 나타내려면 마침표 앞에 백스페이스(\)를 추가해 이스케이프하면 됩니다. 그러면 마침표 기호에 해당하는 것만 선택됩니다.
[그림1-131 스페이스 다음의 첫 대문자 일치]
이번에는 입력란 끝에 [A-Z]를 추가했더니 단어의 첫 글자가 선택 범위에 추가됐습니다. 이것은 알파벳의 모든 대문자를 선택하는 기능을 합니다.
지금까지 한 문단에서 마침표 다음에 공백이 두 개 이상인 곳을 선택하는 작업을 했는데 이대로 치환하면 안 되므로 선택된 부분에서 마침표와 문장의 첫 글자를 선택에서 제외해야 합니다. 이들 정규 표현식은 선택의 범위를 좁히기 위해 사용된 것일 뿐입니다.
[그림1-132 마침표와 문장의 첫 대문자 제외]
먼저 제외할 정규 표현식의 앞에는 괄호로 묶고 ‘?<=’를 추가합니다. 이것은 앞에 추가된 것을 제외할 때 사용합니다. 제외할 정규 표현식의 뒷부분도 괄호로 묶고 ‘?=’를 사용합니다. 이 상태에서 Replace All 버튼을 클릭하면 선택된 곳이 공백 하나로 치환됩니다.
[그림1-133 정규 표현식 전용 프로그램 RegExr]
정규 표현식을 제대로 파악하려면 위와 같은 툴을 사용하는 것이 편리합니다. 정규 표현식은 사용되는 편집기나 언어마다 다를 수 있기 때문입니다. 또한 치환 버튼을 누를 필요 없이 입력한 대로 바로 변경되어 표시되며, 정규 표현식에서 사용되는 각종 특수 기호의 목록과 해당 기능에 대한 설명도 제공됩니다.