2012-04-09 9 views
4

次のコードが "と一致するものがありません。"と表示される理由はありますか?コンパイラやライブラリのバージョンに関する何か?私はg ++ a.cppでコンパイルしました。tr1/regexに関する問題。反対の結果を返します

#include <tr1/regex> 
#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    const std::tr1::regex pattern("(\\w+day)"); 

    std::string weekend = "Saturday and Sunday"; 

    std::tr1::smatch result; 

    bool match = std::tr1::regex_search(weekend, result, pattern); 

    if(match) 
    { 
     for(size_t i = 1; i < result.size(); ++i) 
     { 
     std::cout << result[i] << std::endl; 
     } 
    }else 
    std::cout << "no match" << std::endl; 

    return 0; 
} 
+0

+1完全なテストケースです。 –

+0

このコードは非常に明白で、標準に向かって(少なくとも私のバージョンでは)コンパイラの不完全なサポートが疑われています。これをどのように確認できますか? – cateof

+0

参照用:MSVC 2010 SP1(16.00.40219.01)は、一致を正しくコンパイルして検索します。使用しているGCCのバージョンを指定していません。 – DCoder

答えて

0

問題によって結果になるだろう。 <boost/regex.hpp>の場合は<tr1/regex>を交換することをお勧めします(Linuxを使用しているので、特に簡単です)。名前空間もstd::tr1::の代わりにboost::になりますが、他のすべての構文はまったく同じで、すべての問題を解決する可能性があります。

ブーストを使用できない場合、それはまったく別の話です。過去1年かそこらで、ほとんどの人/雇用者/企業は、はるかに後押ししています。

また、テストケースに欠陥があることにも注意してください。ループはありますが、単一の値しか印刷されません。 regex_searchは一度に値を返します。新しい検索開始インデックスで検索結果をすべて取得する必要があります。もしあなたがプログラムの出力が何もなかったとすれば、バグがあなたのコードにあったと言います。しかし、コードは、現在と書かれているので、"Saturday"または""を返す必要があります。

0

()をエスケープしましたか。いくつかの正規表現の実装では、グループ化に\(を使用する必要があります。とにかくあなたはおそらくそれを必要としません。

このための最も基本的な正規表現は次のようになります。

"[a-zA-Z]+day" 

そして、あなたはあなたのコンパイラで間違いresult[0]

+0

"勝ち目がない"。コンパイラの問題を探します – cateof