Después de un día de piratería y lectura, no he tenido suerte con el motor de expresiones regulares de boost, espero que alguien aquí pueda ayudar.
Quiero tomar el primer campo de cada línea donde el último campo coincida con alguna entrada.
string input =
"449 a dingo ate my baby THINGn"
"448 a dingo ate my baby THINGn"
"445 a dingo ate my baby BOOGNISHn"
"446 a dingo ate my baby BOOGNISHn"
"447 a dingo ate my baby STUFFn";
Digamos que le doy a mi expresión regular la siguiente cadena ...
string re = "^([0-9]+).+?boognish$";
boost::regex expression(re,boost::regex::perl | boost:regex::icase);
y luego configurar mi partido
const int subs[] = { 0, 1 };
boost::sregex_token_iterator it(input.begin(), input.end(), expression, subs);
boost::sregex_token_iterator end;
while ( it != end )
{
fprintf(stderr,"%s|n", it->str().c_str());
*it++;
}
Aquí está la salida que estoy recibiendo de boost, tenga en cuenta que pedí la línea completa y el grupo 1, también pedí una "|" para que podamos ver fácilmente el final de la línea:
449 a dingo ate my baby THING
448 a dingo ate my baby THING
445 a dingo ate my baby BOOGNISH|
449|
446 a dingo ate my baby BOOGNISH|
446|
Realmente quiero 445 | y 446 | solo, pero esta dandoyo 449 (hasta que llega al primer BOOGNISH) y luego 446. He probado esto en otros analizadores, y parece funcionar bien. ¿Qué estoy haciendo mal con boost?
¡Gracias de antemano!
Respuestas
1 para la respuesta № 1de acuerdo con este articale tienes que pasar flag match_not_dot_newline
al algoritmo de coincidencia. Creo que eso resolvería tu caso.