티스토리 뷰

C++

[C++11] std::regex를 사용해 보자.

xaida 2017. 11. 27. 15:24

원래 boost에 있던 라이브러리가 이번에 C++11에서 표준으로 추가되어 매우 기분이 좋습니다.

정규식을 사랑하는 한 사람으로서 auto 만큼이나 기쁜 소식이네요.

 

그래서 간단한 사용법을 정리해 둡니다.

flag들까지 하면 기능이 좀 다양한데, 이번에는 회사 저녁먹는 시간이니까...

 

정규식 검색에 사용되는 객체는 다음과 같습니다.

  - std::regex

  - std::smatch

  - std::ssub_match

 

그리고 정규식 검색에 사용되는 함수는 

  - std::regex_match

  - std::regex_search

  - std::regex_replace

 

이렇게 됩니다.

 

위의 객체와 함수만 있으면 문자열에 정규식을 이용할 수 있습니다.

 

std::regex_match

 

우선은 std::regex_match를 살펴보겠습니다.

이 함수는 해당 패턴이 문자열에 존재하는지 여부를 리턴해 줍니다. 즉 있으면 true, 없으면 false 입니다.


#include <iostream>

#include <string>

#include <regex>

 

using namespace std;

 

int main(void) {

    string str = "a=1";

    std::regex reg("([a-z])=([0-9])");

    smatch m;

 

    if( regex_match(str, m, reg) ) {

        for( auto& sm : m)

            cout << sm << endl;

    }

}



str 은 검색 대상입니다.

reg는 정규식이죠. "소문자알파벳=숫자"로 된 문자열을 찾습니다.

smatch는 검색의 결과입니다. 정규식 검색 이후 결과를 m에 저장합니다.

 

자 그럼 regex_match 함수를 사용해서 str에 정규식 reg가 일치하는지 확인해 봅시다.

이 함수를 위와같이 호출하면 문자열 전체와 일치해야 합니다.

 

그럼 "a=1"은 "소문자알파벳=숫자" 형태로 되어 있으므로 정규식과 일치합니다.

이제 결과 m을 반복하면서 검색 결과를 출력해 보겠습니다.

 

왜 여기에서 for를 사용해서 루프를 도느냐! 하면 정규식에 있는 () 괄호 때문입니다.

정규식에서 괄호를 사용하면 해당 괄호안에 있는 내용을 저장해 둡니다.

 

위의 정규식을 보면 a와 1이 저장되어 있을것입니다.

출력을 해 보면

 

a=1

a

1

 

이렇게 나옵니다.

 

smatch m; 에 검색의 결과가 저장되는데 m[0]은 언제나 검색된 전체 구분이 됩니다. Perl 코드로 비유하면 $_ 가 되겠군요. 그리고 m[1]부터 첫번째 괄호, m[2]는 두번째 괄호가 됩니다. 

따라서 begin()부터 end()까지 루프를 돌면 위와 같은 결과를 얻을 수 있는 것입니다.

 

그리고 match_result 객체의 독특한 기능이 바로 format 입니다.

m.format("<$1>~~<$2>")

위와 같이 호출하면 "<a>~~<1>" 이라는 문자열을 리턴합니다. m[1]은 $1, m[2]는 $2라는 키워드로 치환되는 거죠.

 

간단하네요.

 

std::regex_search

 

이번에는 regex_search입니다.

뭐 따로 설명할 것은 없고, std::regex_match가 정규식이 문자열 전체와 일치해야 했다면, std::regex_search는 문자열 중간에 일치하는 문장이 포함되어 있으면 true 입니다.

 

거의 똑같으므로 예제는 생략..

 

std::regex_replace

 

regex_replace 또한 쉽습니다. 정규식에 일치하는 부분들을 찾아서 모조리 원하는 문자열로 치환해 주는 함수입니다.


#include <iostream>

#include <string>

#include <regex>

 

using namespace std;

 

int main(void) {

    string str = "a=1,b=2,c=3,d=4";

        regex reg("([a-z])=([0-9])");

        smatch m;

 

        str = regex_replace(str, reg, "$2=$1");

 

        cout << str << endl;

}


위의 예제는 문자열에서 "(소문자알파벳)=(숫자)" 패턴을 찾아서 두번째 괄호의 내용과 첫번째 괄호의 내용의 순서를 뒤바꿔 주는 코드 입니다.

 

regex_replace 함수의 첫번째 인자는 치환을 수행하고자 하는 대상, 두번째 인자는 검색하려는 정규식, 세번째 인자는 치환하려는 문자열입니다.

 

치환하려는 문자열이 "$2=$1" 이라고 되어 있는데 $1, $2, $3, ... 들은 정규식에서 괄호를 사용하여 저장한 패턴들을 괄호의 순서대로 저장해둔 변수같은 것이라고 생각하면 됩니다.

 

위의 코드에 대한 결과는 다음과 같습니다.

 

1=a,2=b,3=c,4=d


'C++' 카테고리의 다른 글

[C++] OpenSSL SSL_CTX관련  (0) 2017.11.27
[C++] IP주소 및 포트 정보관련 시스템 함수  (0) 2017.11.27
윈속 초기화 WSAStartup  (0) 2017.11.27
간단한 루프 병렬화(vs2017)  (0) 2017.11.12
간단한 시간 재기  (0) 2017.11.12
공지사항
최근에 올라온 글
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28