Sotto il programma è stato scritto per recuperare le informazioni "Giorno" utilizzando il C++ 11 std::regex_match & std::regex_search. Tuttavia, l'utilizzo del primo metodo restituisce false
e il secondo metodo restituisce true
(previsto). Ho letto la documentazione e la domanda SO già esistente relativa a questo, ma non capisco la differenza tra questi due metodi e quando dovremmo usare uno di essi? Possono essere usati entrambi in modo intercambiabile per qualsiasi problema comune?Differenza tra std :: regex_match & std :: regex_search?
Difference between regex_match and 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";
}
}
uscita
Did Not Found
Found
25
Perché primo metodo regex ritorna false
in questo caso ?. Il regex
sembra essere corretto, quindi idealmente entrambi avrebbero dovuto essere restituiti true
. Ho eseguito il programma di cui sopra modificando loe trovato che restituisce ancora false.
Qualcuno potrebbe spiegare l'esempio precedente e, in generale, utilizzare casi di questi metodi?
Grazie per la spiegazione. Potresti spiegare perché abbiamo dovuto cambiare dalla partita [0] per abbinare [1] per ottenere il risultato esatto in entrambi i casi ?. Voglio dire, parla di std :: smatch usa comprensione. –
@MantoshKumar Ho aggiunto le parentesi attorno al campo della data '(\ d {2})' per creare un gruppo di cattura. Dalla 'match_results' [documentazione] (http://en.cppreference.com/w/cpp/regex/match_results/operator_at),' match [0] 'restituisce sempre l'intera espressione abbinata, mentre' match [1] ' restituisce la prima sotto-partita e così via. In questo caso, abbiamo avuto solo un gruppo di acquisizione, per il giorno, e quindi è archiviato nella prima sotto-partita. – Praetorian