使用boost regex从字符串中提取IP地址?

时间:2011-02-22 04:29:11

标签: c++ boost-regex

我想知道是否有人可以帮助我,我一直在寻找正则表达式的例子,但我仍然无法理解它。

字符串看起来像这样:

“用户JaneDoe,IP:12.34.56.78”

“用户John Doe,IP:34.56.78.90”

我将如何创建一个与上述字符串匹配的表达式?

2 个答案:

答案 0 :(得分:4)

问题是你想要如何匹配这些,以及你想要排除什么?

任何传入字符串与简单.*匹配是微不足道的(但很少有用)。

为了更准确地匹配这些(并添加提取用户名和/或IP等内容的可能性),您可以使用类似:"User ([^,]*), IP: (\\d{1,3}(\\.\\d{1,3}){3})"的内容。根据您的输入,此可能仍会遇到包含逗号的名称的问题(例如,“John James,Jr。”)。如果你必须考虑到这一点,那么匆忙就会变得更加丑陋。

编辑:这里有一些代码来测试/演示上面的正则表达式。目前,这是使用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地址,但是(几乎没有)足够不同的格式可以清楚地表明它匹配并打印出单个部分,而不仅仅是传递整个字符串。

答案 1 :(得分:3)

#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;
}

编辑:修正了字符串中缺少的逗号,由Davka指出,并将cmatch更改为smatch