-
정규 표현식의 분류에 따른 차이점과 올바른 사용법Programmer/Computer Science 2015. 1. 19. 15:54
정규 표현식은 개발이나 운영에 중요한 도구다.
매뉴얼이 없어도 자유자재로 사용할 필요가 있다.이 글은 유사성을 묶어서 알아야 하는 내용을 줄이고,
각 분류 간의 차이점을 드러내어 지식을 확장하는 방법을 사용하였다.분류는 기본 정규식, 확장 정규식, 펄 호환 정규식(PCRE, Perl-Compatible Regular Expressions), 이맥스 정규식으로 나누어 살펴보겠다.
표준 정규식
정규 표현식
의미
.
임의의 한 문자
[]
문자 클래스
[^]
부정 문자 클래스. 문자 클래스 안의 문자를 제외한 나머지를 선택
^
문자열이나 행의 시작
$
문자열이나 행의 끝
*
앞 요소를 0회 이상
{n}
앞 요소가 n개
{n,}
앞 요소가 n개 이상
{n,m}
앞 요소가 n개 이상, m개 이하
()
하위식. 정규식 안에 하위 패턴을 지정해서 사용할 경우 사용
\n
일치하는 n번째 패턴
표준 정규식 예 : 이메일
[A-Za-z0-9_]{1,}@[A-Za-z0-9-]{1,}(\.[A-Za-z0-9-]{1,})*\.[A-Za-z]{2,6}
확장 정규식
확장 정규식에는 표준 정규식에 없는 몇가지 메타 문자가 추가되었다.
정규 표현식
의미
.
임의의 한 문자
?
앞의 요소를 0 또는 1회
+
앞의 요소를 1회 이상
|
둘 중의 하나. 예를 들면, "abc|adc"는 "abc"와 "adc" 모두 포함
구문 클래스(syntax classes)
구문 클래스
의미
[:digit:]
숫자
[:alpha:]
문자
[:alnum:]
문자 또는 숫자
[:upper:]
대문자
[:space:]
공백 문자
[:xdigit:]
16진수 숫자
[:cntrl:]
제어 문자
[:ascii:]
ascii 문자
확장 정규식 예 : 이메일
[[:alnum:]_]+@[[:alnum:]-]+(\.[[:alnum:]-]+)*\.[[:alpha:]]{2,6}
펄 호환 정규식
펄 호환 정규식은 몇몇 문자 클래스를 제공한다.
문자 클래스
의미
\w
단어 (영문자, 숫자, '_')
\W
영문자, 숫자, `_' 아닌 문자
\b
낱말 경계
\d
숫자
\D
숫자 아닌 문자
\s
공백 : \t \r \n \v \f
\S
공백 아닌 문자
펄 호환 정규식 예 : 이메일
\b\w+@[\dA-Za-z-]+(\.[\dA-Za-z-]+)*\.[A-Za-z]{2,6}\b
패턴 변경자 (modifiers)
PCRE 변경자는 (?aimsx)의 표현으로 정규 표현식을 변경할 수 있다.
패턴 변경자
의미
i
대문자와 소문자를 구별하자 않음
m
"줄 시작"과 "줄 끝"은 주어진 문자열의 모든 뉴라인 직후와 직전을 인식
s
점 메타문자는 뉴라인을 포함하는 모든 문자를 인식
x
공백 문자는 이스케이프 되거나 문자 클래스 안에 있을 경우를 제외하고, 완전히 무시
패턴 변경자 사용 예
(?i)a
a와 A
positive and negative look-around 1
정규 표현식
이름
사용 형태
의미
(?=)
positive lookahead
a(?=b)
a 다음 b가 일치
(?!)
negative lookahead
a(?!b)
a 다음 b가 일치하지 않음
(?<=)
positive lookbehind
(?<=a)b
a가 일치하고 b가 나옴
(?<!)
positive lookbehind
(?<!a)b
a가 일치하지 않고 b가 나옴
positive and negative look-around 사용 예
apple(?= computer) apple(?! computer) (?<=apple )computer
apple 다음에 ' computer'가 나오는 apple만 얻음
apple 다음에 ' computer'가 나오지 않는 apple만 얻음
'apple ' 다음에 오는 computer만 얻음이맥스 정규식
비교표
emacs 정규 표현식
정규 표현식
의미
\(\)
()
\{n,m\}
{n,m}
앞 요소가 n개 이상, m개 이하
\|
|
둘 중의 하나. 예를 들면, "abc\|adc"는 "abc"와 "adc" 모두 포함
[[:word:]_]
\w
단어 (영문자, 숫자, '_')
[[:digit:]]
\d
숫자
\w \sw
[A-Za-z0-9]
단어 (영문자, 숫자)
\W \Sw
[^A-Za-z0-9]
단어 아닌 문자
\s-
\s
공백 문자 (아래 구문 클래스 참고)
\S-
\S
공백 아닌 문자
\< \>
\b
낱말 경계
\_< \_>
심볼의 시작/끝
- \scode : 구문이 code와 일치
- \Scode : 구문이 code와 일치하지 않음
몇가지 구문 코드
구문 코드
의미
-
공백문자
w
단어
_
심볼
.
구두점
( )
괄호 열기, 닫기
"
인용 부호
< >
주석 열기, 닫기
구문 클래스 예
\sw 단어와 일치, \Sw 단어와 일치하지 않음이맥스 정규식 예 : 이메일
\<[[:word:]_]+@[[:word:]-]+\(\.[[:word:]-]+\)*\.[[:word:]]\{2,6\}\>
선택 지침
다음은 상황에 맞는 정규식을 선택하는 지침이다.
- 프로그래밍이 아니고, 확장 정규식이 가능한지 모르겠으면, 기본 정규식만 사용한다.
- 확장 정규식을 지원하는 도구 몇가지를 기억한다.
몇가지 되지 않으니 외워두자. awk, egrep 등
확장 정규식을 사용할 수 있으면 잘 활용한다. - 프로그래밍을 할때는 펄 호환 정규식을 사용한다.
대부분의 프로그래밍 언어/라이브러리에서 사용한다. - 이맥스 환경에서는 이맥스 정규식을 사용한다.
- [정규표현식] 이것이 고급이다 - (Positive, Negative) Lookahead, Lookbehind [본문으로]
- 이맥스 정규식의 메타 문자 중에 '\(' '\)' '\{' '\}' '\|'는 '\' 붙어있다. '\'이 없으면 보통 문자이다. 나머지 메타문자에는 `\'를 붙일 필요가 없다는 뜻이다. [본문으로]
'Programmer > Computer Science' 카테고리의 다른 글
여러가지 데이터 표현 양식 비교 (0) 2020.03.11 JSON (0) 2017.02.01 국내에서 IPv6 주소를 접하기 어려운 이유 (2) 2014.03.14 GLib의 GHashTable로 알아보는 해시 테이블의 충동 해결 방법 (1) 2013.09.17 GLib의 GTree로 알아보는 균형 이진 트리 알고리즘 (0) 2013.08.20 댓글