728x90
반응형

정규식(Regular Expression)은 긴 문자열 안에서 특정한 패턴을 가진 문자열을 찾아내기 위해 사용된다.

예를 들어 웹페이지 안에서 이메일 주소를 추출한다거나 로그파일에서 특정 에러 메시지를 추출할때 매우 편리하게 사용할 수 있다.

우선 regex를 테스트하기 위한 여러 웹 어플리케이션들이 있지만 Regex101이라는 사이트가 가장 사용하기 편리했다. https://regex101.com/

사용 방법은 위에 캡쳐한 이미지처럼 'TEST STRING' 입력창 에 실험 대상이 들어갈 문자열들을 입력해놓고, 'REGULAR EXPRESSTION' 입력창에 찾고자하는 패턴을 입력하면 된다.

나는 이 실험 대상에 임의의 6개 단어를 참가시켰고, 찾고자 하는 패턴 'bo' 를 입력했더니 'MATCH INFORMATION'에 3군데 일치하는 곳이 있음을 알려주고 있다.

'bo'라는 패턴을 조금 더 정확히 해석하면
"b 다음에 o가 나오는 문자열이 있나요?" 라고 질문을 던진 것이다. 이처럼 정규식은 앞에서부터 한글자씩 일치하는지 여부를 확인한다.

문자집합 (Charecter Set)

대괄호('[ ]')를 이용하면 문자집합을 나타낼 수 있다. 문자집합은 대괄호 안에 오는 어떤 문자든 오면 일치시킨다.
같은 예제에 패턴 'bl[ao]'를 입력해보았다. 이를 해석하면 "b 다음에 l이 있고, 그 다음에 a 또는 o가 오는 문자열이 있나요?" 라고 풀이할 수 있다.

수량자 (Quantifier)

중괄호('{ }')를 이용하면 수량을 나타낼 수 있다.
같은 문자가 여러번 나올 때는 그 중괄호 안에 문자가 반복되는 횟수를 입력하여 더 간단하게 표현할 수 있다.
이번엔 기존 예제에 두개의 실험 대상을 더 추가하고 'bo{4}' 라고 패턴을 입력해보았다.
해석하자면 "b 다음에 o가 네번 반복되는 문자열이 있나요?" 라는 질문이다.

그룹화 (Group)

소괄호('( )')를 이용하면 그룹을 나타낸다. 지금까지 본 것 처럼 정규식은 기본적으로 한 단어씩 일치 여부를 확인하지만, 소괄호 안에 여러개의 문자를 넣으면 괄호안에 포함된 단어를 하나의 그룹으로 묶어서 판단한다. 예를 들어 '(bo){2}'라는 패턴을 입력해보자. 소괄호가 없었다면 o 가 두번 반복되는지 여부를 판단하겠지만 bo를 소괄호로 묶어주어 bo 가 두번 반복되는지 여부를 판단한다.

그룹화를 하게되면 기본적으로 캡쳐도 동시에 되는데,
캡쳐된 그룹은 'MATCH INFORMATION' 창을 보면 캡쳐된 그룹을 볼 수 있다. 아래 예제는 날짜 중에 특히 몇월인지 캡쳐하는 방법이다.
(참고로 '\d' 는 '아무 숫자'를 의미하고, '\w' 는 '특수문자를 제외한 아무문자'를 의미한다)

여기까지 잘 이해했다면, 그 다음부터는 특별한 설명 없이 아래 표만 참고해도 충분히 이해 할 수 있을 것 같다. 이 표는 Regex 에서 가장 많이 사용되는 패턴들을 정리한 표이다.

 

패턴 설명 예제
[abc] a,b,c 중에 아무거나
[^abc] a,b,c 를 제외하고 아무거나
[a-z] a 부터 z까지 문자중에 아무거나
[^a-z] a 부터 z까지 문자를 제외하고 아무거나
. 아무 문자 하나
a|b a 또는 b
\s 공백문자 중에 아무거나
\S 공백문자를 제외한 아무거나
\d 숫자 중에 아무거나
\D 숫자를 제외하고 아무거나
\w 알파벳이나 숫자 중에 아무거나
\W 알파벳이나 숫자를 제외하고 아무거나(특수문자)
(?:...) 그룹화하지만 캡쳐는 하지 않음
(...) 그룹화하고 캡쳐
a? a 가 없거나 한개 있거나
a* a 가 없거나 여러개 있거나
a{3} a가 3개
a{3,} a가 3개이거나 그 이상이거나
a{3,6} a가 3개 이상 6개 이하
^ 문자열 시작
$ 문자열 끝
\b 단어의 경계
\B 단어의 경계 아닌 아무거나
728x90
반응형

+ Recent posts