Cómo obtener un reemplazo preg_match_all básico para std :: string en C ++?
Pregunta
con "básica" se entiende: Sólo los operadores "+" (-> siguiente ..) y "|" (-> o). Se necesitan
Prototipo:
preg_match_all(std::string pattern, std::string subject, std::vector<std::string> &matches)
Ejemplo de uso:
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);
Los partidos debe estar disponible a través de afterwardsa matches[n]
. Alguien tiene una pista sin con impulso y / o PCRE? Si no es así, cómo llegué a esta realizada con el impulso?
Solución
Se podría utilizar algo rollup std :: string :: hallazgo , haciendo partidos a través de un funtor, y empujando los resultados en un vector de cadenas.
La forma en que se dio cuenta de impulso es algo excesivo para lo que quieres -. Primera vez que se necesita para descomponer la expresión en lexems y luego compilar una máquina de estados para analizar la expresión regular dada
Otros consejos
Esto devolverá un vector de todos los partidos un índice que se encontraron en.
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;
}
Mira en Boost.Regex, http : //www.boost.org/doc/libs/1_41_0/libs/regex/doc/html/index.html