*정규표현식 기초

2020. 5. 7. 16:31[개발] 지식/미분류

정규표현식_0
이미지 로컬라이징 필요

정규식의 개념

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

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

정규식의 종류

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

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

정규식의 기초 문법

정규 표현식에서 사용되는 기호를 Meta문자라고 표현한다. 표현식에서 내부적으로 특정 의미를 가지는 문자를 말하며 간단하게 정리하면 아래의 표와 같다.

표현식 의미
^x 문자열의 시작을 표현하며 x 문자로 시작됨을 의미한다.
x$ 문자열의 종료를 표현하며 x 문자로 종료됨을 의미한다.
.x 임의의 한 문자의 자리수를 표현하며 문자열이 x 로 끝난다는 것을 의미한다.
x+ 반복을 표현하며 x 문자가 한번 이상 반복됨을 의미한다.
x? 존재여부를 표현하며 x 문자가 존재할 수도, 존재하지 않을 수도 있음을 의미한다.
x* 반복여부를 표현하며 x 문자가 0번 또는 그 이상 반복됨을 의미한다.
x y
(x) 그룹을 표현하며 x 를 그룹으로 처리함을 의미한다.
(x)(y) 그룹들의 집합을 표현하며 앞에서 부터 순서대로 번호를 부여하여 관리하고 x, y 는 각 그룹의 데이터로 관리된다.
(x)(?:y) 그룹들의 집합에 대한 예외를 표현하며 그룹 집합으로 관리되지 않음을 의미한다.
x{n} 반복을 표현하며 x 문자가 n번 반복됨을 의미한다.
x{n,} 반복을 표현하며 x 문자가 n번 이상 반복됨을 의미한다.
x{n,m} 반복을 표현하며 x 문자가 최소 n번 이상 최대 m 번 이하로 반복됨을 의미한다.

Meta 문자들 중에서 좀 더 특수하게 사용되는 문자들이 존재한다. '[]' 는 내부에 지정된 문자열의 범위 중에서 한 문자만을 선택하다는 특수한 의미를 가진다. 그리고 내부에서 Meta문자를 사용하면 다른 의미를 가지고 동작할 수 있으므로 잘 확인하고 사용해야 한다. 좀 더 특별한 용도로 사용되는 것들은 아래의 표와 같다.

표현식 의미
[xy] 문자 선택을 표현하며 x 와 y 중에 하나를 의미한다.
[^xy] not 을 표현하며 x 및 y 를 제외한 문자를 의미한다.
[x-z] range를 표현하며 x ~ z 사이의 문자를 의미한다.
^ escape 를 표현하며 ^ 를 문자로 사용함을 의미한다.
\b word boundary를 표현하며 문자와 공백사이의 문자를 의미한다.
\B non word boundary를 표현하며 문자와 공백사이가 아닌 문자를 의미한다.
\d digit 를 표현하며 숫자를 의미한다.
\D non digit 를 표현하며 숫자가 아닌 것을 의미한다.
\s space 를 표현하며 공백 문자를 의미한다.
\S non space를 표현하며 공백 문자가 아닌 것을 의미한다.
\t tab 을 표현하며 탭 문자를 의미한다.
\v vertical tab을 표현하며 수직 탭(?) 문자를 의미한다.
\w word 를 표현하며 알파벳 + 숫자 + _ 중의 한 문자임을 의미한다.
\W non word를 표현하며 알파벳 + 숫자 + _ 가 아닌 문자를 의미한다.

정규표현식을 사용할 때 Flag 라는 것이 존재하는데 Flag를 사용하지 않으면 문자열에 대해서 검색을 한번만 처리하고 종료하게 된다. Flag는 다음과 같은 것들이 존재한다.

Flag 의미
g Global 의 표현하며 대상 문자열내에 모든 패턴들을 검색하는 것을 의미한다.
i Ignore case 를 표현하며 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미한다.
m Multi line을 표현하며 대상 문자열이 다중 라인의 문자열인 경우에도 검색하는 것을 의미한다.

출처

참고

<