Come ottenere una base preg_match_all di ricambio per std::string in C++?
Domanda
con la "base" si intende:Solo gli operatori "+" (->seguito..) e "|" (->o) sono necessari.
Prototipo:
preg_match_all(std::string pattern, std::string subject, std::vector<std::string> &matches)
Esempio Di Utilizzo:
std::vector<std::string> matches;
std::string pattern, subject;
subject = "Some text with a lots of foo foo and " + char(255) + " again " + char(255);
pattern = "/" + char(255) + char(255) + "+|foo+/";
preg_match_all(pattern, subject, matches);
Le partite dovrebbero essere disponibili afterwardsa via matches[n]
.Qualcuno ha un suggerimento senza utilizzando boost e/o PCRE?Se non, come ho ottenuto questo realizzato con boost?
Soluzione
Si potrebbe cumulativo qualcosa utilizzando std::string::trovare, facendo partite tramite un funtore, e spingendo i risultati su una stringa vettoriale.
Il modo in cui è realizzato in boost è probabilmente eccessivo per quello che si vuole, è prima necessario scomporre l'espressione in lexems e quindi compilare una macchina a stati per l'analisi del dato regexp.
Altri suggerimenti
Restituisce un vettore di tutte le partite di un indice che sono stati trovati all'.
std::vector<std::pair<std::string, unsigned int>> RegexPP::MatchAll(std::string pattern, std::string haystack) {
std::vector<std::pair<std::string, unsigned int>> matches;
std::regex p(pattern);
std::sregex_iterator start(haystack.begin(), haystack.end(), p), end;
for(; start != end; start++) {
auto match = *start; // dereference the iterator to get the match_result
matches.push_back(std::pair<std::string, unsigned int>(match.str(), match.position()));
}
return matches;
}
Guardare in Spinta.Regex, http://www.boost.org/doc/libs/1_41_0/libs/regex/doc/html/index.html