Search code examples
c++regexboostboost-regex

C++ Regular Expressions with Boost Regex


I am trying to take a string in C++ and find all IP addresses contained inside, and put them into a new vector string.

I've read a lot of documentation on regex, but I just can't seem to understand how to do this simple function.

I believe I can use this Perl expression to find any IP address:

re("\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b");

But I am still stumped on how to do the rest.


Solution

  • Perhaps you're looking for something like this. It uses regex_iterator to get all matches of the current pattern. See reference.

    #include <boost/regex.hpp>
    #include <iostream>
    #include <string>
    
    int main()
    {
        std::string text(" 192.168.0.1 abc 10.0.0.255 10.5.1 1.2.3.4a 5.4.3.2 ");
        const char* pattern =
            "\\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
            "\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
            "\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
            "\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b";
        boost::regex ip_regex(pattern);
    
        boost::sregex_iterator it(text.begin(), text.end(), ip_regex);
        boost::sregex_iterator end;
        for (; it != end; ++it) {
            std::cout << it->str() << "\n";
            // v.push_back(it->str()); or something similar     
        }
    }
    

    Output:

    192.168.0.1
    10.0.0.255
    5.4.3.2
    

    Side note: you probably meant \\b instead of \b; I doubt you watnted to match backspace character.