[Regular Expression] 정규표현식 리터럴 문자와 메타문자 정리
리터럴 문자
정규 표현식에서는 매칭하는 가장 기본이 되는 최소 단위가 문자입니다. 알파벳 “abc”, 숫자 123과 같은 것은 모두 문자입니다.
앞서 작성했던 정규 표현식은 3개의 문자로 구성된 정규 표현식입니다. 한글 텍스트 또한 문자이며, 한글 한 글자는 문자 1개가 됩니다.
정규 표현식에서는 이런 일반 텍스트 문자를 리터럴 문자(Literal Character)라고 칭합니다. 굳이 한글 표현으로 하면 “순수한 문자” 정도입니다. 그리고 정규 표현식은 기본 설정으로 대소문자를 구분합니다. “a”와 “A”는 다른 문자이며, 정규 표현식으로 서로 매치되지 않습니다.
대소문자를 무시하려면 플래그로 “i”를 사용해야 합니다.
메타문자(Meta Character)
리터럴 문자가 아닌 모든 문자는 메타문자가 됩니다. 정규 표현식에서 특별한 의미를 가지고 있는 문자이며, 명령어와 같은 기능을 하기 때문에 문자로 인식되지 않습니다. 정규 표현식에는 이렇게 특정 기능을 하는 문자를 메타문자(Meta Character)라고 합니다.
정규 표현식에는 캐럿(^), 달러($), 백슬래시(\), 물음표(?), 별표(*), 더하기(+), 마침표(.), 파이프(|), 대괄호([]), 소괄호(()) 등의 메타문자가 있습니다.
그 밖에 “역 슬래시 + 영문자1개”의 조합으로 만드는 메타문자들이 있습니다. “\s”는 공백 1개, “\d”는 숫자 1개, “\w”는 단어 1개, “\b”는 단어 경계를 가리킵니다.
메타문자들은 다음과 같은 의미를 가집니다. 각각의 자세한 사용 방법은 차례대로 배우게 되므로 이런 메타문자들이 있다는 것만 일단 알고 넘어가면 됩니다.
기본 메타문자
가장 사용 빈도가 높은 메타문자입니다. 매칭하는 문자의 개수와 위치를 한정하는 가장 기본적인 메타 문자입니다.
메타문자 |
기능 |
\ |
역 슬래시 다음에 오는 메타문자를 리터럴 문자로 표시합니다. \\, \$, \? |
^ |
입력 문자열의 시작 위치부터 일치하도록 합니다. |
$ |
입력 문자열의 끝 위치에 일치하도록 합니다. |
. |
\n(줄 바꿈 문자)를 제외한 아무 문자 1개. |
? |
0 또는 1개의 선행 문자 일치. |
* |
0개 이상의 선행 문자 일치. 일치하는 최대한의 길이만큼 매치함. |
+ |
1개 이상의 선행 문자 일치. 일치하는 최대한의 길이만큼 매치함. |
범위, 수량 메타문자
중괄호({})는 반복 회수 범위를 표현하고, 대괄호([])는 선택적인 문자열 범위를 표현합니다.
메타문자 |
기능 |
(패턴) |
패턴을 소괄호로 감싸서
그룹으로 묶습니다. 일치하는 패턴을 찾으면 그 문자열 을 캡처 그룹(Capture Group)으로 기억합니다. 기억한 캡처 그룹 문자열은 이후의
패턴 매칭에서 \0, \1과 같이 캡처 그룹이 저장된 순서대로 불러와 사용할 수 있습니다. |
a|b |
문자열 선택형 파이프(|). a 또는 b 문자열과
일치합니다. or 조건으로 선택적으로 일치합니다. |
{n} |
선행 문자를 n번 일치합니다.
n은 0 이상의 정수입니다. a{3}은 aaa와 같습니다. |
{n,} |
선행 문자를 n번 이상
일치합니다. (n <= 선행문자반복) 최대한의 길이만큼 매치합니다. n은 0 이상의 정수입니다. {0,}은 메타문자 “*”와 같습니다.
{1,}은 메타문자 “+”와 같습니다. |
{n,m} |
선행 문자를 n번 이상
m번 이하로 일치합니다. (n <= 선행문자반복 <= m) n은 0 이상의 정수입니다. {0,1}은 메타문자 “?”와 같습니다. |
[abc] |
문자 클래스(Character
Class)입니다. 집합의 개념이며, 대괄호([])안에 포함된 문자 중 하나와 일치합니다. [abc]는 문자가 알파벳 a, b, c 중 하나이면
일치합니다. |
[^abc] |
대괄호 안에 처음 오는
캐럿(^)은 not을 의미합니다. 문자 클래스 안의 문자가 아니면 일치합니다. [^abc]는 “alpha” 문자열의 “l”과 일치합니다. 정규
표현식 맨 앞에 위치하는 캐럿(^)과는 다른 의미로 사용되므로 주의해야 합니다. |
[A-Z] |
“-”는 문자 클래스
안에서 앞뒤 문자 사이의 범위를 표시합니다. “A-Z”는 “ABCD … XYZ”와 같습니다. 정규 표현식은 대소문자를 구분하므로 범위를 정할
때는 대소문자를 모두 포함할 때는 별도로 범위를 명시해야 합니다. [a-zA-Z]는 영문 대소문자이면 일치합니다. 한글만 선택하려면
[가-힣]으로 범위를 표시합니다. 한글 자모까지 모두 포함하려면 [ㄱ-ㅎ|ㅏ-ㅣ|가-힣]이 됩니다. |
[^A-Z] |
문자 클래스 범위 안에
있지 않은 문자이면 일치합니다. [^A-Z]는 영문 대문자 “ABCD … XYZ”가 아니면 일치합니다. 영문 대문자가 아니면 일치한다고 영문
소문자라고 착각하면 안됩니다. 영문 소문자, 숫자, 메타문자, 그리고 2바이트 문자가 모두 일치합니다. 캐럿은 문자 클래스
맨 앞에 위치해야 합니다. 문자 클래스 중간에 캐럿을 넣어 일부만 아니게 할 수 없습니다. 문자 클래스 중간에 들어간 캐럿은 리터럴 문자로
처리됩니다. |
이스케이프 메타문자
“역슬래시+알파벳 대/소문자” 조합으로 특정 매칭 기능을 하는 메타문자입니다.
메타문자 |
기능 |
\b |
단어의 경계를 일치합니다.
경계는 문자가 아니며, 단어 앞 뒤의 공백과 단어 사이의 경계를 말합니다. 단어 앞뒤에 각각 개별적으로 적용됩니다. ch\b 정규 표현식은
switch에는 일치하지만 channel에는 일치하지 않습니다. 단어의 처음이나 끝에
패턴을 일치시켜야 할 때 사용합니다. 문자열에서 캐럿 (^)과 달러($)가 하는 기능을 단어에서 \b가 하는 것으로 이해하면 됩니다. 한글 단어(2바이트
언어 공통) 경계는 인식하지 못합니다. |
\B |
단어의 끝이 아니면
일치합니다. ch\B 정규표현식은 switch에는 일치하지 않지만 channel에는 일치합니다. 한글 단어(2바이트 언어 공통) 경계는 인식
하지 못합니다. |
\d |
숫자 1개와 일치합니다. |
\D |
숫자가 아닌 모든 문자와
일치합니다. |
\f |
폼 피드(Form
Feed) 문자와 일치합니다. |
\n |
줄 바꿈 문자와 일치합니다. |
\r |
캐리지 리턴(Carriage
Return) 문자와 일치합니다. |
\s |
공백 1개와 일치합니다. |
\S |
공백이 아닌 모든 문자와
일치합니다. |
\t |
탭 문자와 일치합니다. |
\v |
수직 탭 문자와 일치합니다. |
\w |
단어 문자와 일치합니다.
[a-zA-Z0-9_]와 같습니다. 단어를 구성하는 문자 1개와 일치하는 것입니다. 정규 표현식 엔진 내부에서 [a-zA-Z0-9_]로 일치하기
때문에 한글 단어(2바이트 언어 공통)는 인식하지 못합니다. |
\W |
단어 문자가 아닌 것과
일치합니다. [^a-zA-Z0-9_]와 같습니다. 영문 알파벳, 숫자, 언더바가 아닌 모든 것(한글 및 기타 언어 문자 포함)합니다. |
이외에도 메타문자들이 더 있지만 특정 개발 언어, 또는 운영체제에서만 지원되기 때문에 호환성 문제로 거의 사용되지 않습니다.
메타문자를 리터럴 문자로 사용하기
“역 슬래시(\) + 메타문자” 조합을 사용하면 메타문자를 일반 리터럴 문자로 사용할 수 있습니다.
메타문자인 마침표(.)는 아무 문자나 1개를 나타내지만 “\.”로 표기하면 리터럴 문자인 마침표 문자로 정규 표현식 매치를 합니다. 이렇게 역 슬래시와 메타문자를 조합해서 리터럴 문자로 사용하는 것을 “이스케이프(Escape)” 한다고 합니다.
주의해야 할 이스케이프 방법들
역 슬래시 문자(\)는 역 슬래시를 2개 겹쳐서(\\) 리터럴 문자로 표시합니다.
문자 클래스 맨 앞에 오는 캐럿(^) 문자는 문자 클래스 안의 문자를 제외한 나머지를 일치합니다. 문자 클래스 맨 앞의 캐럿을 리터럴 문자로 사용하려면 “\^”표현합니다. 문자 클래스 중간에 오는 캐럿은 별도로 이스케이프 할 필요가 없습니다.