Wie ein Grund preg_match_all Ersatz für std :: string in C ++ bekommen?
Frage
mit "basic" ist gemeint: Es wird nur die Operatoren "+" (-> folgenden ..) und "|" (-> oder). Nötig sind, um
Vorbild:
preg_match_all(std::string pattern, std::string subject, std::vector<std::string> &matches)
Verwendungsbeispiel:
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);
Die Spiele sollten zur Verfügung afterwardsa über matches[n]
sein. Jemand bekam einen Hinweis ohne mit Auftrieb und / oder PCRE? Wenn nicht, wie kann ich dies mit Boost realisiert hat?
Lösung
Sie könnten etwas mit std :: string :: find Rollup , Streichhölzer über einen Funktor tun, und die Ergebnisse auf ein String-Vektor drücken.
So wie es im Boost realisiert ist, ist wahrscheinlich übertrieben für das, was Sie wollen -. Sie würden zuerst den Ausdruck in Lexeme zersetzen müssen und dann eine Zustandsmaschine kompilieren für die gegebene regexp Parsen
Andere Tipps
Das wird wieder ein Vektor aller einen den Index übereinstimmt sie gefunden wurden.
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;
}
Schauen Sie in Boost.Regex, http : //www.boost.org/doc/libs/1_41_0/libs/regex/doc/html/index.html