2009-06-14 20 views
9

私は自分自身を覚えようとしています。
私はPython、perl、javascriptに精通していますが、過去には の教室の設定で、C++を短く遭遇しました。私の質問の素朴さを許してください。C++は正規表現を使用して文字列をトークン化します

正規表現を使用して文字列を分割したいのですが、多くの運がなかったので、C++でこれを行う方法の明確で決定的で効率的かつ完全な例が見つかりました。 Perlで

これはアクションでは一般的であり、したがって、些細な方法で達成することができ、

/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 

私はC++に相当するものを達成するために最善の方法を知っているように思います。

EDIT:
私は、以下に述べるように、私がブーストライブラリで探していたものを見つけたと思います。

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

これには「分割」機能も含まれていますか? 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; 
    } 

} 
1

正規表現は、Visualに含まTR1の一部でありますC++ 2008 SP1(Express Editionを含む)およびG ++ 4.3。

ヘッダーは<regex>で、名前空間はstd :: tr1です。 STLとうまく動作します。

Getting started with C++ TR1 regular expressions

Visual C++ Standard Library : TR1 Regular Expressions

あなたはそれがあなたの質問の一部になるのではなく、あなた自身の質問への答えとして、一部「自分で見つける」を追加する必要があり
関連する問題