Como obter uma substituição básica preg_match_all para std :: string em c ++?
Pergunta
com "básico" significa: apenas os operadores "+" (-> a seguir ..) e "|" (-> ou) são necessários.
Protótipo:
preg_match_all(std::string pattern, std::string subject, std::vector<std::string> &matches)
Exemplo 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);
As partidas devem estar disponíveis depois matches[n]
. Alguém tem uma dica sem usando impulso e/ou pcre? Caso contrário, como eu consegui isso percebi com o Boost?
Solução
Você pode reprimir algo usando std :: string :: encontre, fazendo correspondências por meio de um functor e empurrando os resultados para um vetor de string.
A maneira como é realizada em Boost é provavelmente um exagero pelo que você deseja - você primeiro precisaria decompor a expressão em lexems e depois compilar uma máquina de estado para analisar o regexp fornecido.
Outras dicas
Isso retornará um vetor de todas as correspondências e o índice em que foram encontrados.
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;
}
Olhe para Boost.Regex, http://www.boost.org/doc/libs/1_41_0/libs/regex/doc/html/index.html