2016-11-18 3 views
3

Ich habe ein kleines Problem mit einem C++ 11 RegEx und ich denke, es geht um greedigenes.C++ 11 RegEx, nicht-gierig

Hier ist ein kleines Beispiel.

#include <stdio.h> 
#include <string> 
#include <regex> 

int main (void) 
{ 
    std::string in="{ab}{cd}[ef]{gh}[ij][kl]"; // the input-string 

    std::regex rx1 ("(\\{.+?})(.*)", std::regex::extended);  // non-greedy? 
    std::smatch match; 

    if (regex_match (in, match, rx1)) 
    { 
    printf ("\n%s\n", match.str(1).c_str()); 
    } 

    return 0; 
} 

würde ich

{ab} 

für die Ausgabe erwarten. Aber ich habe

{ab}{cd}[ef]{gh} 

ich das Ergebnis erwarten würde ich, wenn ich es gierig tun, aber nicht mit dem? nach dem. +. Sollte es nicht gierig machen, oder?

Also, was ist das Problem in meiner Idee? Danke für Hilfe!

Chris

+0

Warum Sie die öffnende geschweifte Klammer nicht entkommen mit '\\ {', aber Sie nicht die schließende geschweifte Klammer entkommen? – Bobulous

+0

@Bobulous das ist ein Regex spezielle char, die hilft, das vorherige Muster zu wiederholen .. –

+1

Ich denke, Sie sollten nicht verwenden, std :: regex :: extended, es macht Ihre Regex POSIX ERE-konform, die nicht unterstützt Lazy Quantoren. –

Antwort

2

Sie müssen die std::regex::extended entfernen, es macht Ihre regex POSIX ERE konform, und dass regex Geschmack unterstützt nicht faul quantifiers.

std::regex rx1("(\\{.+?})(.*)"); 

Siehe C++ demo