2017-05-04 8 views
-1

以下は正規表現を使って文字列にマッチするが動作していないC++プログラムです。私のOSはUbuntu Linuxで、コンパイラは標準のC++コンパイラで、ubuntuに付属しています。以下のC++の正規表現は機能しません。なぜ説明できますか?

g++ -o test test.cpp -std=c++11 

以下のように++グラムを使用してコンパイルし、プログラムを実行する上で

#include <iostream> 
#include <regex> 

using namespace std; 

int main() { 
    const char s[] = "This is a target string"; 
    regex e ("^([0-9a-zA-Z]*).*?"); 
    cmatch matches; 
    if(regex_match(s, matches, e)) { 
     cout << "Match found" << endl; 
     for (int i = 0; i < matches.size(); ++i) { 
      cout << matches[i] << endl; 
     } 
    } 
    return 0; 
} 

は、パターンが正常に動作していると私はrubular.com .Iでそれを試してみまし出力以下

terminate called after throwing an instance of 'std::regex_error' 
    what(): regex_error 
[1] 24898 abort (core dumped) ./test 

で失敗していますそれを印刷することを期待しています

Match Found 
This is a target string 
This 

C++で正規表現を初めて使用しています。正しい方向に私を指差してください。

+1

コンパイラバージョンGCC 4.8のですか? (Ubuntu 14.04のデフォルトです) –

+0

私は再現できませんが、文字列の最後に疑問符を含めるつもりでしたか?通常、 '? 'は特殊文字ですが、'。* 'はすでに0以上の値にマッチしているので、何にも当てはまりません。だから、文字列 '? 'にマッチすると解釈されると思いますが、あまり定義されていない可能性があります。 – happydave

+1

試してみてください:' g ++ --version'そしてバージョンが 'GCC 4.9'より小さければ正規表現は機能しません。コンパイラをアップグレードする必要があります。 – Galik

答えて

0

try/catchを使用してregex_errorをキャッチし、e.what()を印刷して、何が間違っていたのかを知ることができますか?

ところで、それはC++ 11のフラグと私のgccで完璧に働いた

catch (const std::regex_error& e) { 
     std::cout << "regex_error caught: " << e.what() << '\n'; 
     if (e.code() == std::regex_constants::error_brack) { 
      std::cout << "The code was error_brack\n"; 
     } 
    } 
+0

C++で構築した正規表現パターンに問題があるようです。 – lucifer

+0

エラーをキャッチしようとしたときにこれを得ました: 'regex_error catch:regex_error コードはerror_brack'でした – lucifer

関連する問題