Problem z wyciąganiem regexem adresów URL.

0

Cześć, próbuję napisać kod, który mi wyciągnie z danego tekstu adresy URL. Sprawdzałem różne wyrażenia z internetu i niestety one nie działają pod biblioteką <regex>. Co zrobić, aby ten kod działał?

#include <iostream>
#include <string>
#include <regex>
using namespace std;

int main()
{
    string napis="http://www.google.pl test123456789 https://www.x.com   abccdeffff";
    smatch wynik;
    //regex wyr("https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)");
    regex wyr("^(http:\\/\\/www\\.|https:\\/\\/www\\.|http:\\/\\/|https:\\/\\/)?[a-z0-9]+([\\-\\.]{1}[a-z0-9]+)*\\.[a-z]{2,5}(:[0-9]{1,5})?(\\/.*)?$");
    while(regex_search(napis, wynik, wyr))
    {
        for(auto i:wynik) cout<<i<<" ";
        cout<<"\n";
        napis = wynik.suffix().str();
    }
    return 0;
}
2

Napisanie dobrego wyrażenie regularnego do tego celu jest bardzo trudne.
Jest tona regexpów, które wyglądają, że działają, ale nie uwzględniają jakiegoś warunku brzegowego.
https://stackoverflow.com/questions/6038061/regular-expression-to-find-urls-within-a-string
Tu widać, że rozwiązań jest tyle ile ludzi i każde ma jakiś mankament.

Już wiele razu to mówiłem, ale powtorze. Wyrażenia regularne powinny stanowić parametr wejściowy programu, a nie stanowić jego integralną cześć.
W innych wypadkach lepiej stosować parsery url.

Poza tym w C++11 pisząc wyrażenie regularne lepiej stosować raw string literal.

regex wyr { R"regex(\b(?:(?:http|ftp)s?:\/\/)?\w+(\.\w+)+(?:\/(?:\w+\/)*(?:\w+\.\w+)?)?\b)regex" };

Powyżej mój kandydat, ale jak powiedziałem pewnie będzie jakiś przypadek, kiedy nie zadziała, albo nie powinno zadziałać.

Reg exp warto testować używając czegoś takiego: https://regex101.com/r/RAAeEU/1
Są jeszcze inne narzędzia online, gdzie można napisać testy i do tego potem dobierać regexp.

0

@MarekR22: Z tymi testerami on-line jest taki problem, że wyrażenia jakie działają pod nim, nie zawsze działają w programie. Już takich testerów używałem do sprawdzania regexów dla adresów URL.

1 użytkowników online, w tym zalogowanych: 0, gości: 1