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 passen

    kann 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 werden

    std::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 .


Anmelden zum Antworten