2011-04-28 31 views
5

Tengo un texto donde una fecha puede verse así: 2011-02-02 o así: 02/02/2011, esto es lo que he escrito hasta ahora, y mi pregunta es, si hay un buen forma de combinar estas dos expresiones regulares en una?Combinando dos expresiones regulares C++ 0x

std::regex reg1("(\\d{4})-(\\d{2})-(\\d{2})"); 

std::regex reg2("(\\d{2})/(\\d{2})/(\\d{4})"); 

smatch match; 
if(std::regex_search(item, match, reg1)) 
{ 
     Date.wYear = atoi(match[1].str().c_str()); 
     Date.wMonth = atoi(match[2].str().c_str()); 
     Date.wDay = atoi(match[3].str().c_str()); 
} 
else if(std::regex_search(item, match, reg2)) 
{ 
     Date.wYear = atoi(match[3].str().c_str()); 
     Date.wMonth = atoi(match[2].str().c_str()); 
     Date.wDay = atoi(match[1].str().c_str()); 
} 
+0

Algunos sintaxis de expresiones regulares han llamado grupos. PCRE sí, pero no creo que admita nombres duplicados. Tal vez la pregunta es: ¿alguna de las variantes de expresiones regulares en C++ 0x admite grupos nombrados duplicados? –

+5

No veo el beneficio. Esto es más fácil de leer que la expresión regular combinada. Esto beneficia el mantenimiento, que es un factor que no debe subestimarse. Este código incluso se puede leer sin documentación; combinándolo, debe documentar el "monstruo-regex". –

Respuesta

5

Se puede combinar las dos expresiones regulares entre sí por |. Como solo se puede combinar uno de los |, podemos concatenar grupos de captura de diferentes partes y pensarlos como un todo.

std::regex reg1("(\\d{4})-(\\d{2})-(\\d{2})|(\\d{2})/(\\d{2})/(\\d{4})"); 
std::smatch match; 

if(std::regex_search(item, match, reg1)) { 
    std::cout << "Year=" << atoi(match.format("$1$6").c_str()) << std::endl; 
    std::cout << "Month=" << atoi(match.format("$2$5").c_str()) << std::endl; 
    std::cout << "Day=" << atoi(match.format("$3$4").c_str()) << std::endl; 
} 

(expresiones regulares de desgracia C++ 0x no admite el nombre del grupo de captura, de lo contrario me gustaría sugerir un bucle sobre una gran variedad de expresiones regulares utilizando la captura nombrado en su lugar.)

+0

Arg. ¿Sin capturas con nombre? ¿Por qué demonios omitieron esa característica? –

+0

@ Jörgen: Pregunta a ECMA. La expresión regular de C++ se basa en el sabor regex de ECAMScript (Javascript). – kennytm

Cuestiones relacionadas