Mittels Regular-Expression nur Nummern extrahieren
-
Hallo Leute,
ich möchte mittels Regular-Expression mir alle Nummer zurückgeben lassen, welche in einen String sind. (Ich nutze dazu die Boost-Library)
Es will einfach nicht klappen.
Hier mein Code, mit dem ich es derzeit versuche:#include <stdio.h> #include <iostream> #include <boost/regex.hpp> using namespace std; int main(int argc, char **argv) { boost::regex pattern; boost::cmatch matches; //char* strPattern = "(.*)([0-9]+)(.*)"; char* strPattern = "([0-9]+)"; char* strText = "Dies hier 123456789 ist eine Zahl! Und diese 987654321 auch."; pattern = strPattern; if (boost::regex_match(strText, matches, pattern)) { for (int i = 1; i < matches.size(); i++) { //cout << "matches[i].first : " << matches[i].first << endl; //cout << "matches[i].second: " << matches[i].second << endl; string match(matches[i].first, matches[i].second); cout << "\tmatches[" << i << "] = " << match << endl; } } return 0; }Als Ausgabe sollte folgendes erscheinen:
**
machtes[1] = 123456789
machtes[2] = 987654321
**Was mache ich falsch?
Ich habe mir ein Tool Namens "Rad Software Regular Expression Designer" installiert, mit welchem ich mir super das gewüschte Ergebniss ansehen kann.Es ruf um HILFE ein verzweifelter C++ Anfänger.
-
wenn man etwas in einem String sucht muss man regex_search benutzen. Und das Ergebnis liefert Dir auch immer nur einen (!) Ausdruck zurück; folglich muss der regex_search mehrfach aufgerufen werden, wenn man beliebig viele Treffer haben will.
So geht's:#include <iostream> #include <boost/regex.hpp> using namespace std; int main() { char* strText = "Dies hier 123456789 ist eine Zahl! Und diese 987654321 auch."; boost::regex pattern( "([0-9]+)" ); boost::cmatch matches; for( const char* i = strText; boost::regex_search( i, matches, pattern ) ; i = matches[0].second ) { for( int i = 1; i < int(matches.size()); ++i ) { string match(matches[i].first, matches[i].second); cout << "\tmatches[" << i << "] = " << match << endl; } } return 0; }Gruß
Werner
-
Danke dir Werner.
Das ist genau was ich wollte.
Wenne mich mal siehst.... einfach anhauen... dafür gebe ich einen aus.
Gruß
Niko
-
Darf ich vielleicht eine etwas bisschen einfachere Lösung angeben?

#include <boost/regex.hpp> #include <string> #include <iostream> #include <algorithm> void regex_callback(boost::smatch const& rMatch) { std::cout << rMatch.str() << std::endl; } int main() { boost::regex Pattern("([0-9]+)"); std::string Text = "Dies hier 123456789 ist eine Zahl! Und diese 987654321 auch."; boost::sregex_iterator Iter(Text.begin(), Text.end(), Pattern); boost::sregex_iterator End; std::for_each(Iter, End, ®ex_callback); return 0; }Anstatt der Callback-Funktion kann man natürlich auch einen Funktor oder ein Boost.Bind oder sonst was verwenden.
Grüssli