Boost.Regex Problem
-
Hi,
Ich verzweifel grad mit Boost.Regex:
eigentlich wollte ich nur auf Anfrage eines Freundes dieses PHP skript$str = file_get_contents('any_file.html'); $ip_count = preg_match_all('/[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/', $str, $ips); print_r($ips);in ein C++ prog umschreiben -dachte das kann nicht so schwer sein, v.a. seit TR1 bzw. Boost.Regex einen C++ Regex standard eingeführt haben...
Aber aus den tutorials werde ich nicht ganz schlau.
Ich will eigentlich nur eine HTML file nach dem vorkommen einer IPv4 durchsuchen und diese ausgeben.
Aber boost hat wenn ich das richtig sehe keine möglichkeit eine list oder eonen vector o.ä. zurückzugeben, mit aleln results die passenkann mir jemand helfen udn mir sagen, wie ich mit boost.Regex an die einzelnen substring, die auf nen pattern passen, komme?
Danke schonmal im Voraus ...
MfG
Branleb
-
mal schaun
// zusammengestueckelt, muesste noch getestet werdenstd::vector<std::wstring> Strings; // your strings with the sentences to search inside std::vector<std::wstring> founded; // store the founded strings std::wstring SearchFor = L"[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"; try { for(std::size_t i = 0; i < Strings.size(); ++i) { boost::wregex expression(SearchFor); boost::match_results<std::wstring::const_iterator> cResult; if(boost::regex_search(Strings[i], cResult, expression)) founded.push_back(Strings[i]); } } catch(boost::regex_error &RegExex) { boost::regex_constants::error_type code = RegExex.code(); std::ptrdiff_t position = RegExex.position(); // output error "code" and "position" inside "SearchFor" return false; } catch(...) { // unknown error }// edit: gekapselt isses schoener
std::vector<std::wstring> Strings; // fill "Strings" std::vector<std::wstring> founded = GetRegExStrings(L"[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}", Strings); /*..*/ std::vector<std::wstring> GetRegExStrings(std::wstring exp, std::vector<std::wstring>& originalstrings) { std::vector<std::wstring> founded; try { for(std::size_t i = 0; i < originalstrings.size(); ++i) { boost::wregex expression(exp); boost::match_results<std::wstring::const_iterator> cResult; if(boost::regex_search(originalstrings[i], cResult, expression)) founded.push_back(originalstrings[i]); } } catch(boost::regex_error &RegExex) { boost::regex_constants::error_type code = RegExex.code(); std::ptrdiff_t position = RegExex.position(); // output error "code" and "position" inside "exp" return false; } catch(...) { // unknown error } return founded; }
-
Ich hab dir hier ein Beispiel gemacht das Funktioniert. Die Regex aus deinem php Beispiel war aber falsch, ich hab sie darum angepasst. Der Punkt war nicht Maskiert und der Anfang und das Ende muss auch irgendwie definiert sein.
#include <iostream> #include <iterator> #include <fstream> #include <boost/regex.hpp> using namespace std; int main() { // File öffnen ifstream in("any_file.html"); if(!in){ cerr << "File konnte nicht geöffnet werden\n"; return -1; } // File Inhalt in string kopieren in >> noskipws ; istream_iterator<char> in_begin(in), in_end; string str(in_begin, in_end); // File schliessen in.close(); // String durchsuchen const boost::regex expression("[^.0-9]([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})([^.0-9]|$)"); string::const_iterator start = str.begin(); string::const_iterator end = str.end(); boost::match_results<std::string::const_iterator> what; while(regex_search(start, end, what, expression)){ cout << what[1] << "\n"; // Neue start position setzen start = what[0].second; } }
-
Ich weis zwar nicht, was du meinst mit Falsch bezüglich meines PHP-RegEx,
aber trotzdem Danke für dein Beispiel, Tanren.
Ich habe glaube ich jetzt verstanden, was ich bisher falsch gemacht habe...Auch Danke Mr Evil für dein Beispiel ...
-
Falsch in dem Sinne das mit /[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/ zwar Ip Adressen gefunden werden, es werden aber auch etliche andere Sachen gefunden.
z.B. eine einfache 7 Stellige Zahl würde auch gefunden werden oder ein Teil aus 12342.23.43.2321244 .