/ / boost grupos de captura de expresiones regulares - c ++, regex, boost, boost-regex

aumenta los grupos de captura de expresiones regulares - c ++, regex, boost, boost-regex

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 № 1

de acuerdo con este articale tienes que pasar flag match_not_dot_newline al algoritmo de coincidencia. Creo que eso resolvería tu caso.