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 regulare
toda la secuencia de caracteres[first,last)
....
Devuelvetrue
si existe tal coincidencia, de lo contrario esfalse
.
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 regulare
....
Devuelvetrue
si existe tal secuencia, de lo contrario esfalse
.
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
.