【问题标题】:How can i get the specific part of text我怎样才能得到文本的特定部分
【发布时间】:2022-01-13 22:19:10
【问题描述】:

我有一个包含一些 IP 地址的文本文件。

IP地址换个地方怎么获取(比如从头取IP地址写到最后)

文本示例:

"192.168.4.163 - - [22/Dec/2016:22:32:32 +0300] "GET / HTTP/1.1" 200 3279 "-" "w3af.org""
"192.168.4.163 - - [22/Dec/2016:22:32:32 +0300] "GET / HTTP/1.1" 200 3279 "-" "w3af.org""
" - - [22/Dec/2016:22:32:32 +0300] 192.168.4.163 "GET / HTTP/1.1" 200 3279 "-" "w3af.org""

代码部分:

    ifstream listfile;
    listfile.open("log.txt");
    ofstream cleanIp;
    cleanIp.open("ipAddress.txt");
    
    ifstream readIp;
    string ipLine;
    readIp.open("ipAddress.txt");
    
    string temp;
    while(listfile>>temp) //get just ips
    {
        cleanIp<<temp<<endl;
        listfile>>temp;
        getline(listfile, temp);
    }

【问题讨论】:

  • 一个好的第一步是编写一个在字符串中查找 IP 地址的解析器。 C++(据我所知)中没有任何东西可以为您做到这一点。尝试创建它,发布代码,我们可以从那里开始。
  • 您可以将正则表达式系统与.*(\d+\.\d+\.\d+\.\d+).* 之类的匹配项一起使用。你可能不得不玩一下。
  • 在您的示例中,IP 地址始终位于开头。如果你想在不同的地方处理 IP 地址,你的例子应该提供包含 IP 地址的行,而不是在开头。
  • @Mehmet 你为什么不分享你的尝试?然后简化它。例如,尝试仅获取 192 部分。那将是一个更简单的正则表达式。

标签: c++ file


【解决方案1】:

标准库包括正则表达式。

你可以使用接近的东西:

std::string find_ip(const std::string& line) {
    std::regex rx{ "\\d+\\.\\d+\\.\\d+\\.\\d+" };
    std::smatch ip;
    if (std::regex_search(line, ip, rx)) {
        return ip.str();
    }
    return "";
}

应用于示例中的任何行,这始终返回字符串 192.168.4.163

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2019-06-08
    相关资源
    最近更新 更多