Regular Expression
Perl, Java, C#은 언어 자체에서 정규표현식을 지원하지만 C++에선 -_ -
boost의 정규표현식을 사용하자.
예제. http://network.hanbitbook.co.kr/view.php?bi_id=1218
Unicode 와 ICU 지원.
http://icu.sourceforge.net/
bjam -sICU_PATH=c:\boost\icu -sICU_LINK=c:\boost\icu\lib -sTOOLS=vc-7_1 install
좋은 토크나이저
http://www.linuxselfhelp.com/HOWTO/C++Programming-HOWTO-7.html
예제.
간단한 예제를 하나 들면.(유니코드 지원입니다. ICU 설치 안함)
'\n'을 기준으로 토큰화를 하는 함수
void Tokenize(const wstring& str,
deque<wstring>& tokens,
const wstring& delimiters = L"\n")
{
// Skip delimiters at beginning.
wstring::size_type lastPos = str.find_first_not_of(delimiters, 0);
// Find first "non-delimiter".
wstring::size_type pos = str.find_first_of(delimiters, lastPos);
while (wstring::npos != pos || wstring::npos != lastPos)
{
// Found a token, add it to the vector.
tokens.push_back(str.substr(lastPos, pos - lastPos));
// Skip delimiters. Note the "not_of"
lastPos = str.find_first_not_of(delimiters, pos);
// Find next "non-delimiter"
pos = str.find_first_of(delimiters, lastPos);
}
}
std::wstring log;
boost::wregex re;
boost::wcmatch matches;
deque<wstring> tokens;
Tokenize(log, tokens); //(log에 문자열이 들어갑니다)
re = L"여기에 정규표현식";
while ( tokens.size() > 0 ) // 토큰이 남아있으면
{
if ( boost::regex_match(tokens.front().c_str(), matches, re)) // 정규표현식과 match가 된다면
{
for ( unsigned column=1; column <matches.size(); column++ ) // match가 남아있는 동안
{
wstring match(matches[column].first, matches[column].second);
wcout << match << endl; // 출력합니다.
}//for
}//if
tokens.pop_front(); // tokens에서 맨 앞을 하나씩 pop(제거)합니다.
}//while