2013-02-02 13 views
5

Spojrzałem na wiele źródeł dla nowej biblioteki regex C++ 11, ale większość z nich bardziej skupia się na składni lub bardziej podstawowym użyciu rzeczy takich jak regex_match, lub regex_search. Chociaż te artykuły pomogły mi zacząć korzystać z biblioteki regex, trudno mi było znaleźć więcej szczegółów na temat grup przechwytywania.C++ 11 Regex Znajdź identyfikator grupy przechwytywania

Co staram się osiągnąć, to dowiedzieć się, do której grupy przechwytywania pasuje. Do tej pory znalazłem tylko jeden sposób, aby to zrobić.

#include <iostream> 
#include <string> 
#include <regex> 

int main(int argc, char** argv) 
{ 
    std::string input = "+12 -12 -13 90 qwerty"; 
    std::regex pattern("([+-]?[[:digit:]]+)|([[:alpha:]]+)"); 

    auto iter_begin = std::sregex_token_iterator(input.begin(), input.end(), pattern, 1); 
    auto iter_end = std::sregex_token_iterator(); 

    for (auto it = iter_begin; it != iter_end; ++it) 
    { 
     std::ssub_match match = *it; 
     std::cout << "Match: " << match.str() << " [" << match.length() << "]" << std::endl; 
    } 

    std::cout << std::endl << "Done matching..." << std::endl; 
    std::string temp; 
    std::getline(std::cin, temp); 

    return 0; 
} 

W zmieniając wartość czwartego argumentu std::sregex_token_iterator mogę kontrolować, które submatch będzie na bieżąco, informując go wyrzucić resztę nich. Dlatego też, aby dowiedzieć się, do której grupy przechwytującej pasuje dany gracz, mogę po prostu przejrzeć grupy przechwytujące, aby dowiedzieć się, które mecze nie są odrzucane dla konkretnej grupy.

Jednak, byłoby to niekorzystne dla mnie, bo chyba jest jakiś buforowanie dzieje się w tle spodziewałbym każdą budowę std::sregex_token_iterator ponownie przejść nad wejściem i znaleźć mecze (ktoś proszę mnie poprawić, jeśli jest to źle, ale jest to najlepszy wniosek, do którego mogłem dojść).

Czy istnieje lepszy sposób na znalezienie grupy przechwytywania, do której należy mecz? A może iteracja nad danymi jest najlepszym sposobem działania?

Odpowiedz

5

Zamiast tego należy użyć regex_iterator. Będziesz mieć dostęp do match_results dla każdego meczu, który zawiera wszystkie sub_match es, gdzie możesz sprawdzić, do której grupy przechwytującej należy ta gra.

+0

Dziękuję bardzo, że działało dokładnie tak, jak miałem nadzieję. – TheCodeBroski

Powiązane problemy