2016-07-19 16 views
1
私は苦労たとえば名のコードのようにblabla = "blabla" XYZと一致する

C++ C++コードに正規表現変換正規表現

(?<=name=")(?:[^\\"]+|\\.)*(?=") 

を書くことがあり

(であるC++で)

初めての正規表現... どうすればいいですか?

std::regex TheName("(?<=name=")(?:[^\\"]+|\\.)*(?=")"); 

正しくお願いしますか?

+0

なし:: regex'がlookbehindsをサポートしています。キャプチャグループを使用します。 'std :: regex TheName(" name = \ "([^ \" \\\\] *(?:\\\\。[^ \ "\\\\] *)*)\" ");' –

答えて

1

C++の正規表現では、ポジティブなlookbehindではなくキャプチャを使用する必要があります。また、([^"\\]|\\.)*サブパターンをアンロールして正規表現を可能な限り速くするには、ループを解除する原則を使用することをお勧めします。[^\"\\]*(?:\\.[^\"\\]*)*を参照してください。また、正規表現のパターンを定義する際には、余分な文字列リテラル(R"(<PATTERN>)"を参照)を使用することをお勧めします。

C++ demoを参照してください:

#include <iostream> 
#include <regex> 
using namespace std; 

int main() { 
    std::string s = "name=\"bla \\\"bla\\\"\""; 
    std::regex TheName(R"(name=\"([^\"\\]*(?:\\.[^\"\\]*)*)\")"); 
    std::smatch m; 
    if (regex_search(s, m, TheName)) { 
      std::cout << m[1].str() << std::endl; 
    } 
    return 0; 
} 

結果:C++ `のstdでサポートされている正規表現のフレーバーのbla \"bla\"

+0

ok thx - 問題があります。gccを使用しています。-std = C++ 11フラグが設定されていますが、std :: regex_searchは無効な引数を与えます。ここの例http://www.cplusplus.com/reference/regex/regex_search/は同じエラーでコンパイルに失敗します。あなたはアイデアがありますか? – ZoOl007

+0

最新のGCCバージョンを使用してください。あなたは何ですか? –

+0

gcc(Min_WW-W64プロジェクトで構築されたx86_64-posix-seh-rev0)5.3.0私はWindows atmにいます – ZoOl007