C ++ Regex для захвата IP из указанной строки c - PullRequest
1 голос
/ 15 апреля 2020

Я работаю над программой на C ++, которая должна собирать IP-адреса из стандартного вывода Nmap. Я не могу использовать флаги -oX, -oG или -oA по причинам, которые я не хотел бы объяснять. У меня есть следующее регулярное выражение:

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

Я просто хочу получить все IP-адреса из этой указанной c строки вывода Nmap. Однако иногда им предшествует 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

Идея состоит в том, что я должен иметь возможность извлечь точно IP-адреса, которые я хочу использовать, просто

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, с той лишь разницей, что я использовал одиночные экранированные символы backsla sh, и он работал нормально. Я не могу решить, где проблема делает то же самое в моей программе на C ++. Что я делаю не так?

1 Ответ

2 голосов
/ 15 апреля 2020

Я думаю, вы делаете это более сложным, чем нужно. Просто используйте следующее регулярное выражение:

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

Вам не нужно специально сопоставлять такие вещи, как имя домена и скобки, просто пропустите их с помощью .*. Вы не обрабатываете общий текстовый ввод, поэтому не будет никаких ложных срабатываний из-за меньшей точности. Nmap scan report не появится нигде, кроме начала строк, поэтому вам не нужно совпадать с ^.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...