正则表达式迭代器在Cpp中不起作用

Regular Expression iterator is not working in Cpp

本文关键字:不起作用 Cpp 迭代器 正则表达式      更新时间:2023-10-16

我正在Visual Studio 2010上使用C++(我不认为它是v11标准,但我还没有检查)。

我正试图用以下代码提取出一个跟踪器的IP地址:

#include <iomanip>
#include <iostream>
#include <string>
#include <regex>
using namespace std;
typedef regex_iterator<string::iterator> regexp;
#define MAX_BUFFER 255
int main() {
    string out;
    char buffer[MAX_BUFFER];
    smatch m;
    regex e("  1.+\[(.+)\]");
    FILE *stream = _popen("tracert SOMEHOSTNAME", "r");
    while ( fgets(buffer, MAX_BUFFER, stream) != NULL ) {
        out = buffer;
        regexp rit (out.begin(), out.end(), e);
        regexp rend;
        while (rit != rend) {
            cout << rit->str() << endl;
            ++rit;
        }
    }
    _pclose(stream);
    cout << "Done.";
    cin >> buffer;
}

但是,regexp并没有提取出组本身。相反,它只是在吐出整条线!

我认为我非常仔细地遵循了示例,但似乎我没有正确使用regex_iterator。

1-如何最好地从这个字符串中提取IP

(附带问题-是否有一个C++函数可以进入网络,从主机名中获取IP,就像tracert我们的品脱一样?另一个函数可以获得mac地址,就像arp-a)

我没有MSVC,GNU已经破坏了对std::regex的支持,所以我在这里玩了`boost::regex':

regex e("^\s*1\s.*?\[(.*?)\]");

注意:

  • 不假定空格是空格而不是制表符
  • 在行首没有假定精确的间距
  • 是否要求在1字符后至少有1个空格(因此它与以13开头的行不匹配,例如)
  • if在可能的情况下使用非贪婪匹配
#include <iostream>
#include <string>
#include <boost/regex.hpp>
using namespace std;
using boost::regex;
using boost::regex_iterator;
#define MAX_BUFFER 255
int main()
{
    char buffer[MAX_BUFFER];
    regex e("^\s*1\s.*?\[(.*?)\]");
    FILE *stream = popen("cat input.txt", "r");
    while(fgets(buffer, MAX_BUFFER, stream) != NULL)
    {
        typedef regex_iterator<string::iterator> regit;
        string out = buffer;
        regit rit(out.begin(), out.end(), e);
        regit rend;
        while(rit != rend)
        {
            cout << (*rit)[1].str() << endl;
            ++rit;
        }
    }
    pclose(stream);
    cout << "Done.n";
}

这似乎适用于input.txt:

Tracing route to 11.1.0.1 over a maximum of 30 hops
1     2 ms     3 ms     2 ms  [157.54.48.1]
2    75 ms    83 ms    88 ms  [11.1.0.67]
3    73 ms    79 ms    93 ms  [11.1.0.1]
Trace complete.

打印:

157.54.48.1