Perl 정규표현식
Perl 정규표현식 (perlre)
정규표현식은 한 문자열이 원하는 패턴을 갖고 있는지 판별하는 역할을 해요. Perl에서는 이 패턴을 담은 문자열을 "패턴(pattern)"이라 부르고, 대상 문자열을 그 패턴에 대입해 매칭(matching) 여부를 확인하지요. 처음 배우는 분이라면 튜토리얼인 perlretut를, 조금 아는 분이라면 퀵스타트인 perlrequick를 먼저 보면 시행착오를 줄일 수 있어요. 여기서는 패턴의 기본 문법과 주요 메타문자부터 살펴볼게요.
본문
정규표현식은 이 문서에서 설명하는 아주 특별한 문법과 의미를 가진 문자열이에요. 이 문자열을 "패턴"이라 부르고, 패턴은 다른 문자열(대상, target)이 그 패턴이 규정하는 특성을 갖는지(혹은 갖지 않는지)를 판별하는 데 쓰여요. 보통 대상 문자열이 첫 피연산자, 패턴이 두 번째 피연산자가 되는 이항 연산자 =~와 !~로 매칭을 수행해요.
$foo =~ m/abc/
이 표현은 변수 $foo의 문자열 어딘가에 "a", "b", "c" 순서의 연속이 들어 있으면 참이 돼요. 아직 변수에 저장되지 않은 패턴은 양끝을 구분자(delimiter)로 감싸야 하고, 보통은 위처럼 슬래시(/)를 써요. 슬래시가 아닌 다른 구분자도 쓸 수 있어요.
$foo =~ m<abc>
패턴 안에 구분자가 들어 있다면 그 구분자를 백슬래시로 이스케이프해야 해요. 예를 들어 "/foo\/bar/"처럼요.
메타문자
패턴 안의 임의의 한 문자는 대상 문자열의 같은 문자와 매칭돼요. 단, 이 문서에서 특별한 의미를 갖는 **메타문자(metacharacter)**라면 얘기가 다르죠. 가장 흔히 쓰는 메타문자는 점(.)인데, 거의 모든 문자(점 자신 포함)와 매칭돼요. 점이 원래의 의미 대신 말 그대로의 점 하나와 매칭되게 하려면 \.처럼 백슬래시를 붙이면 돼요. 백슬래시 자체도 메타문자라서, \\는 단일 백슬래시 \ 하나와 매칭돼요.
| 메타문자는 둘 중 하나와 매칭할 때 써요.
$foo =~ m/this|that/
$foo가 "this" 또는 "that" 중 하나라도 포함하면 참이 돼요. |는 일반 문자 연속보다 느슨하게(낮은 우선순위로) 묶이기 때문에, 그룹핑 메타문자인 괄호 ( )로 범위를 한정해요.
$foo =~ m/th(is|at) thing/
$foo가 "this thing" 또는 "that thing"을 포함하면 참이에요. 괄호로 감싼 패턴 부분과 매칭된 문자열 조각은 나중에 패턴 안·치환·프로그램에서 쓸 수 있게 따로 보관되는데, 이를 "캡처(capturing)"라 불러요.
대안(alternative)은 왼쪽부터 차례로 시도되어, 전체가 매칭되는 첫 번째 대안이 선택돼요. 즉 대안은 반드시 greedy하지 않아요. 예를 들어 "barefoot"에 foo|foot을 매칭하면 "foo" 부분만 매칭돼요 — 첫 번째로 시도된 대안이 성공했기 때문이죠.
이스케이프 시퀀스
백슬래시는 메타문자의 특수 의미를 없앨 뿐 아니라, 일부 문자·숫자를 자기 자신이 아닌 특별한 의미로 바꿔주기도 해요. 이를 **이스케이프 시퀀스(escape sequence)**라고 해요. 대표적인 것이 \b(단어 경계)인데, 문자와 매칭되는 게 아니라 문자 사이의 0 너비 위치(zero-width)와 매칭되는 0 너비 어서션의 예시예요.
$foo =~ m/\b(fee|fie|foe|fum)\b/
제어 문자는 C 스타일로 쓸 수 있어요. \n은 개행, \t는 탭, \r은 캐리지 리턴과 매칭돼요. \nnn(nnn은 8진수 세 자리)은 그 코드 포인트의 문자와 매칭되고, Perl 5.14부터는 \o{...}로 8진수 자릿수를 늘릴 수 있어요. \xnn은 16진수 두 자리, \x{...}는 16진수 자릿수를 늘릴 때 써요.
문자 클래스와 수량자
점(.)은 사실 "문자 클래스(character class)"의 한 예시인데, 주어진 집합의 어떤 단일 문자와도 매칭되는 것이에요. Perl은 미리 정의된 여러 문자 클래스를 제공해요(\w 단어 문자, \s 공백, \d 10진 숫자 등 — 대문자는 부정). Perl 5.22부터는 use re 'strict'로 기본 규칙보다 엄격한 규칙을 적용해, 문법상 허용되지만 의도와 다를 수 있는 것을 잡아내는 데 쓸 수 있어요.
반복 매칭은 **수량자(quantifier)**로 표현해요. 자세한 목록은 perlre 본문과 perlrebackslash 문서를 함께 보는 걸 권해요.