c++ regex c++11 visual-studio-2013 gcc4.9

c++ - Diferencia entre std:: regex_match & std:: regex_search?



c++11 visual-studio-2013 (2)

Debajo del programa se ha escrito para obtener la información del "Día" usando C ++ 11 std::regex_match & std::regex_search . Sin embargo, usar el primer método devuelve false y el segundo método devuelve true (esperado). Leí la documentación y la pregunta SO ya existente relacionada con esto, pero no entiendo la diferencia entre estos dos métodos y cuándo deberíamos usar alguno de ellos. ¿Pueden ambos ser intercambiados por algún problema común?

Diferencia entre regex_match y regex_search?

#include<iostream> #include<string> #include<regex> int main() { std::string input{ "Mon Nov 25 20:54:36 2013" }; //Day:: Exactly Two Number surrounded by spaces in both side std::regex r{R"(/s/d{2}/s)"}; //std::regex r{"//s//d{2}//s"}; std::smatch match; if (std::regex_match(input,match,r)) { std::cout << "Found" << "/n"; } else { std::cout << "Did Not Found" << "/n"; } if (std::regex_search(input, match,r)) { std::cout << "Found" << "/n"; if (match.ready()){ std::string out = match[0]; std::cout << out << "/n"; } } else { std::cout << "Did Not Found" << "/n"; } }

Salida

Did Not Found Found 25

¿Por qué el primer método regex devuelve false en este caso? La regex parece ser correcta, por lo que idealmente ambas deberían haber sido devueltas. std::regex_match(input,match,r) el programa anterior al cambiar std::regex_match(input,match,r) por std::regex_match(input,r) y encontré que aún devuelve false.

¿Podría alguien explicar el ejemplo anterior y, en general, usar casos de estos métodos?


Es muy sencillo. regex_search examina la cadena para encontrar si alguna porción de la cadena coincide con la expresión regular. regex_match comprueba si toda la cadena coincide con la expresión regular. Como un simple ejemplo, dada la siguiente cadena:

"one two three four"

Si uso regex_search en esa cadena con la expresión "three" , tendrá éxito, porque "three" se puede encontrar en "one two three four"

Sin embargo, si utilizo regex_match en regex_match lugar, fallará, porque "three" no es toda la cadena, sino solo una parte de ella.


regex_match solo devuelve true cuando se ha hecho coincidir toda la secuencia de entrada, mientras que regex_search tendrá éxito incluso si solo una regex_search coincide con la regex .

Citando de N3337,

§28.11.2 / 2 regex_match [re.alg.match]

Efectos: determina si existe una coincidencia entre la expresión regular e toda la secuencia de caracteres [first,last) . ... Devuelve true si existe tal coincidencia, de lo contrario es false .

La descripción anterior es para la sobrecarga regex_match que toma un par de iteradores a la secuencia que se va a emparejar. Las sobrecargas restantes se definen en términos de esta sobrecarga.

La sobrecarga de regex_search correspondiente se describe como

§28.11.3 / 2 regex_search [re.alg.search]

Efectos: determina si hay alguna subsecuencia dentro de [first,last) que coincida con la expresión regular e . ... Devuelve true si existe tal secuencia, de lo contrario es false .

En su ejemplo, si modifica la regex a r{R"(.*?/s/d{2}/s.*)"}; tanto regex_match como regex_search tendrán éxito (pero el resultado del partido no es solo el día, sino la cadena de fecha completa).

Demostración en vivo de una versión modificada de su ejemplo donde el día está siendo capturado y mostrado tanto por regex_match como por regex_search .