2011-11-27 36 views
9

¿Cómo cuento el número de coincidencias usando C++ 11's std::regex?Contar el número de coincidencias

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

Resultados previstos:

7

+2

y su salida es .... –

+0

@EdHeal recibo una [error de compilación] (http://ideone.com/uxyrV): 'error: 'regex_count' no fue declarado en este alcance'. ;) –

Respuesta

15

Usted puede utilizar regex_iterator para generar todos los partidos, a continuación, utilizar distance contarlos:

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

¿Podría explicar qué devuelve 'std :: sregex_iterator' y cuál es la 'distancia' entre los dos medios? –

+1

@muntoo: 'sregex_iterator' es un typedef sobre' regex_iterator', que itera sobre todas las coincidencias en el texto. 'distance' es la función de biblioteca estándar que calcula el número de elementos en un rango de iterador (por lo tanto, en este caso, lee todas las coincidencias y devuelve la cantidad que hay). –

+0

Hola. Incluso si se trata de un hilo viejo: creo que se puede descartar la operación match_count (que en C++ 11 no existe de todos modos), ya que (w) sregex :: iterator ya itera, como se menciona, sobre las coincidencias. Por lo tanto, std :: distance debería devolver el recuento de coincidencias. Lo intenté con gcc 4.6.1 y VS 2013 sin match_count y funciona bien. – gilgamash

3

Se puede utilizar esta:

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

uso Ejemplo:

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

Salida:

7 
Cuestiones relacionadas