2011-05-26 8 views
5

En Perl, puedo hacer esto:std :: equivalente de expresiones regulares de '/ g' modificador mundial

$text = '1747239'; 
@matches = ($text =~ m/(\d)/g); 
# @matches now contains ('1', '7', '4', '7', '2', '3', '9') 

Usando C++ coincidencia de expresiones regulares, ¿cuál es la mejor manera de replicar este comportamiento para que consigo un partido establecer incluyendo todos los partidos?

tengo unas pocas cosas en este momento: -

compiledRegex = std::regex(regex, std::tr1::regex_constants::extended); 
regex_search(text, results, compiledRegex); 

int count = results.size(); 
// Alloc pointer array based on count * sizeof(mystruct). 
for (std::cmatch::iterator match = results.begin(); 
     match != results.end(); 
     ++match) 
{ 
    // Do something with match; 
} 

Sin embargo, esto sólo me va a dar el primer partido, al igual que Perl sin la/g, que está muy bien, pero me gustaría el efecto/g.

Entonces, ¿hay una buena manera de hacerlo, o debo seguir ejecutando la expresión regular una y otra vez?

Respuesta

8

Debe llamar al regex_search varias veces. Su valor de retorno especifica si hay más coincidencias. Cada vez que lo llamas, obtienes una nueva coincidencia. El iterador devuelto por los resultados pasa por las subclases grupales definidas en su expresión regular. La primera entrada es siempre todo el partido, por eso en su caso count == 1

std::string::const_iterator text_iter = text.cbegin(); 
compiledRegex = std::regex(regex, std::tr1::regex_constants::extended); 

while (regex_search(text_iter, text.end(), results, compiledRegex)) 
{ 
    int count = results.size(); 
    // Alloc pointer array based on count * sizeof(mystruct). 
    for (std::cmatch::iterator group = results.begin(); 
      group != results.end(); 
      ++group) 
    { 
     // If you uses grouping in your search here you can access each group 
    } 

    std::cout << std::string(results[0].first, results[0].second) << endl; 
    text_iter = results[0].second; 
} 

creo que sirve

+0

Eso es más o menos lo que estaba de terminar con, supongo que estaba esperando una bandera para hacer regex_search hacer eso. Presumiblemente, ¿necesita mover el puntero de texto al final de la última coincidencia en cada iteración? –

+0

@JonB Tienes razón. Se deben usar los iteradores en lugar de cadena. Al final de cada iteración, el iterador de búsqueda debe actualizarse, usando 'results [0] .second'. He actualizado mi respuesta de manera convincente. – Eugene

Cuestiones relacionadas