2016-07-19 16 views
1

erstes Mal regex (in C++ das ist)C++ regex convert regex C++ Code

ich eine harte Zeit habe

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

zu schreiben, zum Beispiel Namen übereinstimmt = "blabla" xyz als blabla als Code ... Wie kann ich

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

richtig bitte?

+0

Keiner der Regex-Varianten von C++ unterstützt 'std :: regex' Lookbehinds unterstützt. Verwenden Sie eine einfangende Gruppe. 'std :: regex TheName (" name = \ "([^ \" \\\\] * (?: \\\\. [^ \ "\\\\] *) *) \" ");' –

Antwort

1

Sie müssen in C++ - Regex Capturing anstelle von positivem Lookbehind verwenden. Es ist auch ratsam, das Unroll-The-Loop-Prinzip zu verwenden, um das ([^"\\]|\\.)* Submuster auszurollen, um die Regex so schnell wie möglich zu machen, siehe [^\"\\]*(?:\\.[^\"\\]*)*. Es ist außerdem ratsam, bei der Definition von Regex-Mustern Raw-String-Literale zu verwenden (siehe R"(<PATTERN>)"), um Überschreibungen zu vermeiden.

Siehe 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; 
} 

Ergebnis: bla \"bla\"

+0

ok thx - Ich habe ein Problem .. Ich benutze gcc - es hat die -std = C++ 11 Flag gesetzt, aber die std :: regex_search gibt mir ungültige Argumente - sie scheinen mir gut. Das Beispiel hier http://www.cplusplus.com/reference/regex/regex_search/ failes, um mit dem gleichen Fehler zu kompilieren - haben Sie eine Idee? – ZoOl007

+0

Verwenden Sie die neueste GCC-Version. Was ist dein? –

+0

gcc (x86_64-posix-seh-rev0, Erstellt von MinGW-W64-Projekt) 5.3.0 Ich bin auf Windows atm – ZoOl007