2009-06-14 5 views
9

저는 처음부터 약간의 C++를 배우려고합니다.
나는 python, perl, javascript에 능숙하지만 과거에 교실 환경에서 C++를 간단히 만났습니다. 내 질문의 순진함을 변명하십시오.C++은 정규 표현식을 사용하여 문자열을 토큰 화합니다.

정규 표현식을 사용하여 문자열을 분할하고 싶지만 을 C++에서 수행하는 방법에 대한 명확하고 명확하며 효율적이며 완벽한 예제를 찾지 못했습니다.

, 내가 가장 ++ C에 해당하는 작업을 수행하는 방법을 알고 싶습니다

/home/me$ cat test.txt 
this is aXstringYwith, some problems 
and anotherXY line with similar issues 

/home/me$ cat test.txt | perl -e' 
> while(<>){ 
> my @toks = split(/[\sXY,]+/); 
> print join(" ",@toks)."\n"; 
> }' 
this is a string with some problems 
and another line with similar issues 

펄에서이 작업은 일반적입니다, 따라서 사소한 방식으로 수행 할 수 있습니다.

편집 :
아래에서 언급 한 바와 같이 내가 부스트 라이브러리에서 찾고있는 것을 발견했다고 생각합니다.

boost regex-token-iterator (왜 밑줄이 작동하지 않습니다?)

내가 무엇을 검색 몰랐다 같아요.


#include <iostream> 
#include <boost/regex.hpp> 

using namespace std; 

int main(int argc) 
{ 
    string s; 
    do{ 
    if(argc == 1) 
     { 
     cout << "Enter text to split (or \"quit\" to exit): "; 
     getline(cin, s); 
     if(s == "quit") break; 
     } 
    else 
     s = "This is a string of tokens"; 

    boost::regex re("\\s+"); 
    boost::sregex_token_iterator i(s.begin(), s.end(), re, -1); 
    boost::sregex_token_iterator j; 

    unsigned count = 0; 
    while(i != j) 
     { 
     cout << *i++ << endl; 
     count++; 
     } 
    cout << "There were " << count << " tokens found." << endl; 

    }while(argc == 1); 
    return 0; 
} 

+1

이 ... 언급하지만, 당신이 그것을 발견 대답을 게시했습니다. 다른 사람이 나타나서이 질문을 유용하다고 생각하면 ... 선택한 커뮤니티와 함께 ​​선택한 커뮤니티를보고 싶을 것입니다. 당신의 대답은 공동체의 최선의 선택이 아닐 수도 있습니다. –

답변

14

부스트 라이브러리는 일반적으로이 경우 Boost.Regex에서 좋은 선택이다. 이미 원하는 것을 수행하는 토큰으로 문자열을 분할하는 경우에도 an example이 있습니다. 기본적으로 이런 식으로 뭔가에 온다 : 당신이 반복자의 사용을 최소화하고, 코드를 pithify하려면

boost::regex re("[\\sXY]+"); 
std::string s; 

while (std::getline(std::cin, s)) { 
    boost::sregex_token_iterator i(s.begin(), s.end(), re, -1); 
    boost::sregex_token_iterator j; 
    while (i != j) { 
    std::cout << *i++ << " "; 
    } 
    std::cout << std::endl; 
} 
+0

oberoi의 게시물에서 regex_token_iterator에 대한 내 자신의 방법을 찾았지만 간결하고 실제적인 예제를 제공하고 적절한 부스트 페이지에 대한 링크가 포함되어 있기 때문에 답변으로 선택했습니다. 건배. –

1

Perl과 달리 정규 표현식은 C++에 "내장"되어 있지 않습니다.

외부 라이브러리 (예 : PCRE)를 사용해야합니다.

+0

또한 'split'함수가 포함되어 있습니까? python에는 기본 정규 표현식 모듈 인 're'가 포함되어 있습니다.이 모듈은 문자열 분할 편의 기능을 제공합니다. 나는 이것이 같은 방식으로 작동하는지 궁금해? –

+0

이 답변은 제출되었을 때 사실 이었지만 더 이상 C++ 11의 가용성에 대해서는 사실이 아닙니다. '#include ' – Justin

3

Boost.Regex를 확인하십시오. 난 당신이 여기에서 답을 찾을 수 있다고 생각 :

C++: what regex library should I use?

+0

덕분에, 나는 regex_token_iterator에게이 길을 발견했다. –

2

다음 작업을해야합니다 :

#include <string> 
#include <iostream> 
#include <boost/regex.hpp> 

int main() 
{ 
    const boost::regex re("[\\sXY,]+"); 

    for (std::string s; std::getline(std::cin, s);) 
    { 
    std::cout << regex_replace(s, re, " ") << std::endl; 
    } 

} 
관련 문제