2011-11-27 13 views
9

Jak policzyć liczbę meczów przy użyciu C++ 11: std::regex?Liczba liczników meczów

std::regex re("[^\\s]+"); 
std::cout << re.matches("Harry Botter - The robot who lived.").count() << std::endl; 

oczekiwany wynik:

7

+2

A twoja moc jest .... –

+0

@EdHeal otrzymuję błąd kompilacji [] (http://ideone.com/uxyrV): 'error: 'regex_count' nie został zadeklarowany w tym zakresie". ;) –

Odpowiedz

15

Można użyć regex_iterator wygenerować wszystkie mecze, a następnie użyć distance je policzyć:

std::regex const expression("[^\\s]+"); 
std::string const text("Harry Botter - The robot who lived."); 

std::ptrdiff_t const match_count(std::distance(
    std::sregex_iterator(text.begin(), text.end(), expression), 
    std::sregex_iterator())); 

std::cout << match_count << std::endl; 
+0

Czy możesz wyjaśnić, co 'std :: sregex_iterator' zwraca i co" odległość "między dwoma oznacza? –

+1

@muntoo: 'sregex_iterator' jest typedef nad' regex_iterator', które iteruje nad wszystkimi dopasowaniami w tekście. 'distance' to funkcja biblioteki standardowej, która oblicza liczbę elementów w zakresie iteratora (w takim przypadku odczytuje wszystkie dopasowania i zwraca ile ich jest). –

+0

Witam. Nawet jeśli jest to stary wątek: myślę, że możesz upuścić operację match_count (która w C++ 11 i tak nie istnieje), ponieważ (w) sregex :: iterator już iteruje, jak wspomniałeś, nad meczami. Std :: distance powinien więc zwracać liczbę meczów. Próbowałem go używając gcc 4.6.1 i VS 2013 bez match_count i działa dobrze. – gilgamash

3

Można to wykorzystać:

int countMatchInRegex(std::string s, std::string re) 
{ 
    std::regex words_regex(re); 
    auto words_begin = std::sregex_iterator(
     s.begin(), s.end(), words_regex); 
    auto words_end = std::sregex_iterator(); 

    return std::distance(words_begin, words_end); 
} 

Przykład użycia:

std::cout << countMatchInRegex("Harry Botter - The robot who lived.", "[^\\s]+"); 

wyjściowa:

7 
Powiązane problemy