C++ oraz wyrażenia regularne (regex) - nie znajduje dopasowania


(ra-v) #1

Generalnie nie zajmuję się programowaniem w C++, jedynie ładnych parę lat temu uczyłem się sam dal siebie. 

Wyrażenia regularne znam ale z PHP czy Bash, ewentualnie sed, a jakoś nie mogę sobie poradzić z regex'em w C++.

 

Docelowo chciałbym sprawdzić, czy w łańcuchu znaków znajduje się adres IP. Przejściowo próbowałem sprawdzić chociażby czy w łańcuchu są cyfry - bezskutecznie. W założeniu powinien napisać "OK2" i zwrócić 2.

 

Co robię nie tak? Może zapomniałem jakichś podstaw?

// regex regMatch ("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}", regex_constants::extended); 
    regex regMatch("[0-9]*", regex_constants::extended);
    printf("%d\n", regex_match("11223344", regMatch));
    
    if( regex_match("11223344", regMatch) ){
        printf("OK2");
        return 2;
    }

Używam__ gcc 4.8.1 na Linuxa.


(Jim1961) #2

http://stackoverflow.com/questions/5073992/extract-ip-address-from-a-string-using-boost-regex

http://stackoverflow.com/questions/318236/how-do-you-validate-that-a-string-is-a-valid-ipv4-address-in-c

 

… nie rozumiem; u mnie google działa normalnie :stuck_out_tongue:


(ra-v) #3

Na podstawie pierwszego linka zrobiłem to co niżej. 

Zwraca “Blad: 4”

std::string inputs[] = {
        std::string("User JaneDoe, IP: 12.34.56.78"),
        std::string("User JohnDoe, IP: 34.56.78.90")
    };

    try{
        std::regex pattern("User ([^,]*), IP: (\\d{1,3}(\\.\\d{1,3}){3})");
        for (int i=0; i<2; i++)
            show_match(inputs[i], pattern);
    } catch( std::regex_error &e ){
        if (e.code() == std::regex_constants::error_badrepeat)
            std::cerr << "Zly wzorzec.\n";
        else std::cerr << "Blad: " << e.code() << "\n";        
    }

Sugerujesz, żeby użyć boost.regex, zamiast regex? Standardowym regex nie da się tego ogarnąć, jest z tym jakiś problem?


(kostek135) #4

Tak. Przed 4.9 specyfikacja była niekompletna, to że coś czasem zadziała, ot trafiłeś na jakieś snapshoty implementacji. Tu masz więcej: https://gcc.gnu.org/gcc-4.9/changes.html


(ra-v) #5

Ok, dzięki. Boost.Regex śmiga.