Post List

2014년 12월 29일 월요일

regex_search : 문자열내에 정규식 찾기 및 문자열 추출

regex_search

Regular Expression 에 해당하는 문자열을 포함하고 있으면 true 아니면 false를 return 한다.
(regex_match는 정규식과 딱 맞는 것만 true)
이런 단순히 문자열을 찾는 기능 뿐만 아니라 match_results 를 함께 사용하면 좀 더 다양하게 활용이 가능하다.

.com으로 끝나는 e-mail 주소를 찾는 정규식은 아래와 같다.
regex e("[[:w:]]+@[[:w:]]+\.com");

정규식에는 괄호 ( ) 를 이용하여 그룹을 나눌수가 있다. 사용자 이름 쪽과 도메인쪽을 별도의 그룹으로 나눴을 때,
regex e("([[:w:]]+)@([[:w:]]+)\.com");

정규식에 만족하는 문자열, 각 그룹별 문자열,  정규식에 Match 된 부분 앞, 뒤의 문자열을 각각 찾아 낼 수 있다.

match_results 를 m 으로 선언하였을 때,

m[0].str() : Match된 문자열 전체
m[n].str() : n번째 그룹의 문자열 ( m[n].str() 은 m.str(n), *(m.begin()+n) 와 동일 )
m.prefix().str() : 정규식의 앞부분
m.suffix().str() : 정규식의 뒷부분

#include <regex>
#include <iostream>

using namespace std;

int main()
{
  string str;
  smatch m; // typedef match_results<string::const_iterator> smatch;

  regex e("([[:w:]]+)@([[:w:]]+)\.com");

  while (true) {
    cin >> str;
    bool found = regex_search(str, m, e);
  
    cout << "m.size() " << m.size() << endl;
    for (int n = 0; n < m.size(); n++) {
      cout << "m[" << n << "]: str()= " << m[n].str() << endl;
    }
    cout << "m.prefix().str() : " << m.prefix().str() << endl;
    cout << "m.suffix().str() : " << m.suffix().str() << endl;
  }
}

댓글 없음:

댓글 쓰기