C ++ regex pasuje do treści w nawiasach klamrowych [duplikat]
To pytanie ma już odpowiedź tutaj:
Czy gcc 4.8 lub wcześniejsza wersja zawiera błędy w wyrażeniach regularnych? 3 odpowiedzi Załóżmy, że chciałbym wyodrębnić zawartość pasujących nawiasów klamrowych przy użyciu wyrażenia regularnego C ++ 11. Na przykład{foo}
pasuje pomyślnie i mógłbym użyćmatch_result
, aby wyodrębnić zawartość. Wydaje się to proste, ale poniższy kod nie robi dokładnie tego, co chciałbym
std::string foo("{foo}");
std::regex r("\\{(.*)\\}");
std::smatch m;
bool result = regex_match(foo, m, r); // result returns true
cout << m[0] << endl; // prints: {foo}
cout << m[1] << endl; // prints: {foo} instead of just foo as I would expect
Teraz nie powinnom[1]
wróć tylkofoo
bez nawiasów klamrowych, ponieważ jest to pierwsza grupa przechwytywania?
EDYTOWAĆ Istotną informacją dla tego pytania jest to, że kompilatorem, którego używam, jest GCC 4.6.3 (która jest obecnie najnowszą wersją repozytorium w Ubuntu 12.04 LTS). Odpowiedź dokładnie określa, jak słaba jest obsługa wyrażenia regularnego w GCC.