2010-05-17 10 views

Respuesta

2

Esto es lo que he encontrado hasta ahora:

text = "alpha beta"; 
string::const_iterator begin = text.begin(); 
string::const_iterator end = text.end(); 
boost::match_results<string::const_iterator> what; 
while (regex_search(begin, end, what, boost::regex("([a-z]+)"))) { 
    cout << string(what[1].first, what[2].second-1); 
    begin = what[0].second; 
} 

Y funciona como se esperaba. Tal vez alguien sabe una mejor solución?

2

No debe llamar matches.size() antes de la verificación de que algo estaba igualada, es decir, su código debería ser algo así como esto:

#include <boost/regex.hpp> 
boost::cmatch matches; 
if (boost::regex_match("alpha beta", matches, boost::regex("([a-z])+"))) 
    cout << "found: " << matches.size() << endl; 
else 
    cout << "nothing found" << endl; 

La salida sería "no hemos encontrado nada", porque regex_match intenta hacer coincidir la cadena completa Lo que quiere es probablemente regex_search que está buscando una subcadena. El código siguiente podría ser un poco mejor para usted:

#include <boost/regex.hpp> 
boost::cmatch matches; 
if (boost::regex_search("alpha beta", matches, boost::regex("([a-z])+"))) 
    cout << "found: " << matches.size() << endl; 
else 
    cout << "nothing found" << endl; 

Pero es la salida única "2", es decir, coincide con [0] con "alfa" y coincidencias [1] con "a" (la última letra de la alfa - el último grupo coincide)

Para obtener la palabra completa en el grupo, debe cambiar el patrón a ([az] +) y llamar al regex_search repetidamente como lo hizo en su propia respuesta.

este momento para responder 2 años de retraso, pero si alguien googles aquí como lo hice, entonces tal vez será todavía útil para él ...

0

Esto funciona para mí, tal vez alguien le resultará muy útil ..

std::string arg = "alpha beta"; 
boost::sregex_iterator it{arg.begin(), arg.end(), boost::regex("([a-z])+")}; 
boost::sregex_iterator end; 
for (; it != end; ++it) { 
    std::cout << *it << std::endl; 
} 

Lienzo:

alpha 
beta 
Cuestiones relacionadas