※ 요약
이번 포스트에서는 문자 집합을 이용한 검색 방법에 대해 알아볼 것이다. 문자 집합은 이전 포스트에서 배웠던 .(마침표)처럼 모든 문자와의 일치가 아닌, 사용자가 원하는 범위의 문자들과 일치시킬 수 있다. 정규표현식에서 문자 집합은 기초적이고 쉬운 내용이지만 상당히 자주 사용되므로 잘 알아둘 필요가 있다.


※ 문자 집합이 필요한 상황

우리는 t로 시작하고 t로 끝나는, 알파벳으로만 이뤄진 네 글자 단어를 찾아야 하는 상황이라고 가정해보자. 이전 포스트에서 배운 내용으로는 정규표현식을 작성할때 "t..t" 밖에 작성을 못할텐데, "t..t"로는 "test"나 "text"처럼 우리가 원하는 값도 찾지만, "t$%t"나 "t-0t"처럼 우리가 찾지 말아야 하는 것도 찾으므로 문제가 된다. 이럴때 문자 집합을 이용하면 간단히 해결된다.


※ 사용 방법
문자 집합은 메타 문자인 [](대괄호)를 이용하여 표현한다.


※ 사용예
아래는 위의 예제를 수정한 것이다. .(마침표) 대신 메타 문자 []를 이용하여 t로 시작하고 t로 끝나는, 알파벳으로만 이뤄진 네 글자 단어들을 찾았다. [] 안의 a-z는 abcdefghijklmnopqrstuvwxyz와 같은 의미로써, a-z와 일치하는 문자를 검색한다는 의미다.


근데 위의 예제는 오직 소문자만 검색하는데, 대문자도 검색하고 싶으면 아래처럼 A-Z도 추가하면 된다.


아래는 0-9을 이용해 2자리로 숫자로만 이뤄진 단어를 검색하는 예제이다. A-Z처럼 숫자도 0-9로 표현할 수 있으며 당연히 알겠지만 0-9는 마찬가지로 0123456789과 같은 의미다.



이번 예제는 위에서 배운 A-Z, a-z, 0-9 범위들을 응용한 16진수 컬러 코드를 찾는 예제이고 문자 집합 [A-Fa-f0-9]를 이용해 6자리 16진수 0 1 2 3 4 5 6 7 8 9 A B C D E F의 범위를 찾는 정규표현식을 작성해봤다. HTML 컬러코드는 6자리 이므로 [A-Fa-f0-9]를 여섯 번이나 반복했는데.. 너무 길지만 원하는 결과를 얻긴 하였다.


위의 예제는 길어도 너무 길다. 나중에 배울 내용이지만 아래처럼 구간을 지정해서 정규식을 작성하면 간단히 할 수 있다.



※ 제외하고 검색

[](대괄호)안에 문자 집합을 표현할때 ^(캐럿)문자를 사용하면 해당 표현식은 제외가 된다. 예제를 보면 이해가 빠를 것이다.

먼저 {1,}은 나중에 배우겠지만 최소 한 글자거나 그 이상이라는 의미고 [^0-9\n]의 의미는 0-9와 \n를 제외한다는 의미다.

고로 [^0-9\n]{1,}의 의미는 0-9와 \n(개행)을 제외한 최소 한 글자 이상의 패턴을 찾으라는 의미이고 결과는 아래와 같다.


※ 사용시 주의사항

1. -(하이픈)을 이용하여 범위를 지정할때는 작은 값이 먼저 와야 한다. [Z-A]나 [9-0]처럼 값을 거꾸로 하면 안된다.

2. ^(캐럿)은 위치에 따라 의미가 달라진다. []안에서는 제외를, []밖에서는 문자열의 시작을 나타낸다.

 

 

 

 


※ 요약
제목 그대로 기본적인 검색 방법에 대해 알아볼텐데, 어려운 내용이 아니므로 간단하게 설명하고 끝내도록 하겠다.


※ 있는 그대로 검색

평범한 검색 방법이다. 이 검색 방법은 PC로 문서(*.txt나 워드 등) 작업을 해본 사람이면 다 사용해봤을 법한 내용이다.


준비된 예문에 정규표현식 "e"를 입력하였고, 정규표현식 "e"와 일치된 모든 e가 하이라이팅되었다.

여기서 사용된 정규표현식 "e"는 평범한 텍스트여서 정규식처럼 안보일수도 있지만 확실한 정규식이다.

참고로 matches(일치)된 개수는 45개이다.


이번에 사용한 정규표현식은 "123"이며 위에서 사용한 "e"와 마찬가지로 확실한 정규식이다.

다만 "e"나 "123"처럼 평범한 텍스트로만 이루어진 정규표현식은 낭비지만 정규식을 처음 알아가기에는 좋기에 예제로 사용해봤다.



※ 대소문자 다루기

정규표현식은 기본적으로 대소문자를 구분한다. 하지만 대소문자를 무시하는 기능이 있는데, regexr의 경우 flags에서 "ignore case" 옵션을 체크하면 된다. 아래는 대소문자를 무시한 상황에서의 결과 화면인데, 보면 Te도 검색된걸 확인할 수 있다.

 

※ 모든 문자 찾기

정규표현식에서 "."(마침표)는 모든 문자 하나와 일치한다. 무슨 말인지 모르겠으면 아래 결과를 한 번 보면 이해할 수 있을 것이다. 정규표현식 "e.t"를 입력했더니 e로 시작하고 t로 끝나는 모든 문자열을 검색했다. 앞서 설명처럼 "."은 공백 문자가 오든 영문자가 오든 상관없이 모든 문자를 의미한다.(단, 줄바꿈(newline)문자는 제외된 경우도 있다.)

참고로 "."은 메타 문자 중 하나이며, 다른 메타 문자도 알고 싶다면 이전에 올린 포스트를 참고하기 바란다. 


"."은 연달아 사용할 수도 있다. 아래처럼 정규식 "t..t"를 입력하니 t로 시작하고 t로 끝나는 네 글자를 검색하였다.



※ 특수 문자 검색

위에서 "."(마침표)는 특별한 기능(의미)이 부여된 메타 문자라서 검색하려면 "." 앞에 "\"을 붙여줘야 한다.

"\."가 입력된 아래 예제를 보면 한 번에 이해할 것이다. "\"도 "."과 마찬가지로 메타 문자이다.


"\"도 메타 문자라서 마찬가지로 앞에 "\"을 붙여줘야 한다. 예문을 보면 바로 이해할 수 있을 것이다.



  

※ 요약

이번 포스팅에서는 기본 메타 문자와 수량자, 위치 지정, 특수한 문자, 역참조와 전후방 탐색, 대소문자 변환, 변경자들에 대해서 간략하게 표로 알아볼 것이다. 정규표현식에 대해서 거의 모른다면 봐도 별도움이 안되겠지만, 정규식을 예전에 공부했는데 잊어먹었을 경우 레퍼런스로는 많은 도움이 될 것이다.

아무튼 이번 포스팅의 궁극적인 목적은 나와 여러분의 레퍼런스 겸, 앞으로 정규식을 포스팅 함에 있어 원할한 진행을 위해서이다.


※ 설명

기본 메타 문자

 .

 점 하나당 하나의 문자에 해당하며 모든 문자와 일치

 |

 왼쪽 혹은 오른쪽과 일치

 []

 문자 집합 구성원 중 하나와 일치

 [^]

 문자 집합 구성원을 제외하고 일치

 -

 범위 정의 ([A-Z]와 같은 형태)

 \

 다음에 오는 문자를 이스케이프

수량자

 *

 문자가 없는 경우나 하나 이상 연속하는 문자 찾기

 *?

 게으른 * 문자

 +

 문자 하나 이상 찾기

 +?

 게으른 + 문자

 ?

 문자가 없거나 하나인 문자 찾기

 {n}

 정확히 요소와 n번 일치

 {m,n}

 요소와 m에서 n번 일치

 {n,}

 요소와 n번 이상 일치

 {n,}?

 게으른 {n,}

위치 지정

 ^

 문자열의 시작과 일치

 \A

 문자열의 시작과 일치

 $

 문자열의 끝과 일치

 \Z

 문자열의 끝과 일치

 \<

 단어의 시작과 일치

 \>

 단어의 끝과 일치

 \b

 단어 경계와 일치

 \B

 \b와 반대로 일치

단축 문자

(특수한 문자)

 [\b]

 역스페이스

 \c

 제어문자와 일치

 \d

 모든 숫자와 일치

 \D

 \d와 반대

 \f

 페이지 넘기기(form feed)

 \n

 줄바꿈

 \r

 캐리지 리턴

 \s

 공백 문자와 일치

 \S

 \s와 반대로 일치

 \t

 탭

 \v

 수직 탭

 \w

 영숫자 문자나 밑줄과 일치

 \W

 \w와 반대로 일치

 \x

 16진수 숫자와 일치

 \O

 8진수 숫자와 일치

역참조와 전후방 탐색

 ()

 하위 표현식 정의

 \1

 첫 번째 일치한 하위 표현식. 두 번째 일치한 하위 표현식은 \2로 표기

 ?=

 전방 탐색

 ?<=

 후방 탐색

 ?!

 부정형 전방 탐색

 ?<!

 부정형 후방 탐색

 ?(backreference)true

 조건 지정

 ?(backreference)true|false

 else 표현식 조건 지정

대소문자 변환

 \E

 \L 혹은 \U 변환을 끝냄

 \l

 다음에 오는 글자를 소문자로 변환

 \L

 \E를 만날 때까지 모든 문자를 소문자로 변환

 \u

 다음에 오는 글나를 대문자로 변환

 \U

 \E를 만날 때까지 모든 문자를 대문자로 변환

POSIX 문자 클래스

 [:alnum:]

 모든 영숫자 ([a-zA-Z0-9]와 같음)

 [:alpha:]

 모든 영문자 ([a-zA-Z]와 같음)

 [:blank:]

 빈칸(space)이나 탭 문자 ([\t]와 같음)

 [:cntrl:]

 아스키 제어문자(아스키 0번부터 31, 127)

 [:digit:]

 모든 한 자리 숫자 ([0-9]와 같음)

 [:graph:]

 [:print:]와 동일하나 빈칸(space)은 제외

 [:lower:]

 모든 소문자 ([a-z]와 같음)

 [:print:]

 출력 가능한 모든 문자

 [:punct:]

 [:alnum:]이나 [:cntrl:]가 포함되지 않은 모든 문자

 [:space:]

 빈칸을 포함한 모든 공백 문자 ([\f\n\r\t\v]와 같음)

 [:upper:]

 모든 대문자 ([A-Z]와 같음)

 [:xdigit:]

 모든 16진수 숫자 ([a-fA-F0-9]와 같음)

변경자

 (?m)

 다중행 모드

 

 

 



※ 요약
본격적으로 정규표현식을 배우기 전에 소개할 웹사이트가 있다.

RegExr라는 사이트인데, 정규식을 연습하거나 테스트 해볼 수 있고 각 종 레퍼런스도 있어서 공부하기에도 좋다.

무엇보다 좋은 점은 인터넷만 연결되어 있다면 어디에서든지 정규식을 테스트 해볼 수 있다는 것인데, 이는 필자가 예제를 작성하면 독자는 따라서 해보기 아주 좋은 환경을 제공해준다.


※ 사이트 주소


※ 소개

아래 화면은 Regexr에 처음 접속하면 나오는 화면인데, 샘플 예문과 간단한 정규표현식이 미리 입력되어 있다.

앞으로 필자가 아래 예문으로 정규식을 완성하면 독자가 따라하는 방식으로 포스팅을 진행할 예정이다.

 

 


 

※ 소개

정규표현식은 영문으로 Regular Expressions라고 표기하며 보통 정규식 혹은 Regex(레젝스)라고 부른다.

정규식은 모든 종류의 텍스트를 조작하고 처리하기 위해 만들어졌으며, 거의 모든 언어와 플랫폼에서 지원한다.

막연히 텍스트를 조작하고 처리한다고 하여 감이 잘 안올텐데 일단은 문자열의 검색치환을 위한 용도로 쓰이며, 이 작업들을 할때 정규표현식을 이용하면 (상대적으로)간단하게 처리할 수 있다는 것만 알아두자.

정규표현식은 정규 표현 언어를 사용해 만들며 정규 표현 언어에 대해서는 다음 포스팅부터 알아볼것이다.


※ 정규표현식을 사용해야 할 때

- 문자열에서 특정 문자 혹은 특정 문자열을 검색해야 할 때

- 문자열에서 특정 문자 혹은 특정 문자열을 치환해야 할 때


※ 장점
- 문자열에서 검색과 치환을 할 때 정규식을 이용하면 간단하게 작업할 수 있다.

- Modern C++, C#, Java, php, Perl 등등 많은 언어들이 지원한다.


※ 단점
- 문법이 직관적이지 못하고 모르는 상태에서 보면 복잡해보인다.
- 언어마다 정규표현식 문법이 조금씩 다르다.

 

※ 활용
필자는 보통 아래와 같은 상황때 정규표현식을 활용한다.

- 텍스트 파일이나 각 종 문서에서 특정 패턴을 검색할때

- Modern C++로 개발하다가 문자열 검색 및 조작이 필요할때

- 리눅스 명령어 grep을 사용할때

 

 


+ Recent posts