c++ - C++正则表达式从特定行中获取IP

标签 c++ regex

我正在开发一个C++程序,该程序需要从标准 Nmap输出中收集IP。由于我不想解释的原因,我不能使用-oX,-oG或-oA标志。我有以下正则表达式:

std::regex IPRegex("^Nmap scan report for ([\\S]*\\s\\()?(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})");

我只是想从nmap输出的特定行中获取所有IP。但是,有时它们前面带有DNS名称,并用括号括起来,有时却没有,因此,这是我的正则表达式中的第一个可选捕获组。我也认识到,对于C++,我需要加倍反斜杠来转义正则表达式标记/字符串文字。

nmap输出示例:
Nmap scan report for mycomputer.mydomain (192.168.1.1)
Host is up (0.00013s latency).
Not shown: 998 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
8080/tcp open  http-proxy

Nmap scan report for mycomputer2.mydomain (192.168.1.2)
Host is up (0.0085s latency).
All 1000 scanned ports on mycomputer2.mydomain (192.168.1.2) are closed

Nmap scan report for 192.168.1.3
Host is up (0.0057s latency).
All 1000 scanned ports on 192.168.1.3 are closed

我的想法是,我应该能够仅使用
std::sregex_iterator IPIter(output.begin(), output.end(), IPRegex);
std::sregex_iterator end;
while (IPIter != end) {
  std::smatch match = *IPIter;
  IPList += match.str(2);         // Testing with match.str(0) had no matches at all either
  IPIter++;
}

但是我根本没有正则表达式匹配。我使用regex101.com对此进行了测试,唯一的区别是我使用了单个反斜杠转义符,并且运行良好。我无法解决问题在我的C++程序中做同样的事情。我究竟做错了什么?

最佳答案

我认为您正在使此过程变得比所需的复杂。只需使用以下正则表达式:

Nmap scan report for .*\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b

您不需要专门匹配域名和括号之类的内容,只需使用.*跳过它们即可。您无需处理一般的文本输入,因此不会因为精度不够而产生任何误报。 Nmap scan report除了行首以外不会出现在其他任何地方,因此您实际上不需要匹配^

关于c++ - C++正则表达式从特定行中获取IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61217180/

相关文章:

c# - 如何获取在windows平台上传输和接收的字节数?

c++ - 如何将C/C++程序编译成exe格式

php - 如何替换字符串中的第 n 次出现

html - 当文本中存在多个标签时,如何使用正则表达式将单个 html 标签与内部标签相匹配

java - 使用 Java 和 Regex 取消自动链接

c++ - 函数指针类型定义错误

c++ - 异常类

c++ - 将 OMP_SCHEDULE 与 #pragma omp 一起用于并行调度(运行时)

r - 如何提取n位数字之前的1或2个单词?

regex - 反转正则表达式生成数据