2011-05-26 23 views
5

Después de un día de hackear y leer, no he tenido suerte con el motor de expresiones regulares de boost, espero que alguien aquí pueda ayudar.aumentar los grupos de captura de expresiones regulares

Quiero tomar el primer campo de cada línea donde el último campo coincide con alguna entrada.

string input = 
    "449 a dingo ate my baby THING\n" 
    "448 a dingo ate my baby THING\n" 
    "445 a dingo ate my baby BOOGNISH\n" 
    "446 a dingo ate my baby BOOGNISH\n" 
    "447 a dingo ate my baby STUFF\n"; 

Digamos Doy mi expresión regular el 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 recibo de impulso , recuerda que pedí tanto la línea completa como el grupo 1, también pedí un "|" 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 me da 449 (hasta que alcanza el primer BOOGNISH) y luego 446. He probado esto en otros analizadores, y parece funcionar bien. ¿Qué estoy haciendo mal con boost?

¡Gracias de antemano!

+1

'* it ++' debe ser '++ it'. Pero eso (probablemente) no afecta sus resultados. –

Respuesta

1

según this articale tienes que pasar flag match_not_dot_newline al algoritmo coincidente. Creo que eso resolvería tu caso.

+0

Utilice boost :: regex :: no_mod_s para perl! Me tomó un poco de retoques, pero finalmente conseguí que funcionara. Estabas solo un * tad * off, pero realmente cerca. Como estaba usando el motor perl regex, quería que utilizara la opción/versión perl de la marca. (Intenté usar solo match_not_dot_newline, pero todavía se comportaba como antes). Para forzar que el motor perl establezca ese indicador, parece que necesita usar el indicador boost :: regex :: no_mod_s. Gracias por su ayuda. – yggdrasil

+0

es porque fue mi primer encuentro para impulsar y mi primer intento de usar expresiones regulares en cualquier otro lugar que el cuadro de búsqueda de Visual Studio! – Ali1S232

Cuestiones relacionadas