Извлечь IP-адрес из строки, используя регулярное выражение - PullRequest
2 голосов
/ 22 февраля 2011

Мне было интересно, может ли кто-нибудь помочь мне, я искал примеры регулярных выражений, но все еще не могу понять, как это сделать.

Строки выглядят так:

"Пользователь JaneDoe, IP: 12.34.56.78"

"Пользователь JohnDoe, IP: 34.56.78.90"

Как мне поступитьсделать выражение, соответствующее приведенным выше строкам?

Ответы [ 2 ]

4 голосов
/ 22 февраля 2011

Вопрос в том, как именно вы хотите сопоставить их, и что еще вы хотите исключить?

Тривиально (но редко полезно) сопоставлять любую входящую строку с простой .*.

Для более точного соответствия (и добавления возможности извлечения таких вещей, как имя пользователя и / или IP), вы можете использовать что-то вроде: "User ([^,]*), IP: (\\d{1,3}(\\.\\d{1,3}){3})". В зависимости от вашего ввода, это может по-прежнему сталкиваться с проблемой с именем, которое содержит запятую (например, «Джон Джеймс, младший»). Если вы должны это учесть, то в спешке это становится немного ужаснее.

Edit: вот немного кода для проверки / демонстрации регулярного выражения выше. На данный момент, это использует класс (ы) регулярных выражений C ++ 0x - чтобы использовать Boost, вам нужно немного изменить пространства имен (но я считаю, что это должно быть у всех).

#include <regex>
#include <iostream>

void show_match(std::string const &s, std::regex const &r) { 
    std::smatch match;
    if (std::regex_search(s, match, r))
        std::cout << "User Name: \"" << match[1] 
                  << "\", IP Address: \"" << match[2] << "\"\n";
    else
        std::cerr << s << "did not match\n";
}

int main(){ 

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

    std::regex pattern("User ([^,]*), IP: (\\d{1,3}(\\.\\d{1,3}){3})");

    for (int i=0; i<2; i++)
        show_match(inputs[i], pattern);
    return 0;
}

Это распечатывает имя пользователя и IP-адрес, но в (едва) достаточно различном формате, чтобы было ясно, что он сопоставляет и распечатывает отдельные фрагменты, а не просто пропускает целые строки.

3 голосов
/ 22 февраля 2011
#include <string> 
#include <iostream>
#include <boost/regex.hpp>

int main() {

    std::string text = "User JohnDoe, IP: 121.1.55.86";
    boost::regex expr ("User ([^,]*), IP: (\\d{1,3}(\\.\\d{1,3}){3})");

    boost::smatch matches;

    try
    {
        if (boost::regex_match(text, matches, expr)) {

            std::cout << matches.size() << std::endl;

            for (int i = 1; i < matches.size(); i++) {
                std::string match (matches[i].first, matches[i].second);
                std::cout << "matches[" << i << "] = " << match << std::endl;
            }

        }
        else {
            std::cout << "\"" << expr << "\" does not match \"" << text << "\". matches size(" << matches.size() << ")" << std::endl;
        }
    } 
    catch (boost::regex_error& e)
    {
        std::cout << "Error: " << e.what() << std::endl;
    }

    return 0;
}

Отредактировано: исправлена ​​пропущенная запятая в строке, указанная Давкой, и изменено совпадение на smatch

...