2013-08-09 5 views
1

Я работаю с C++ на Visual Studio 2010 (я не думаю, что его стандарт v11, но я не проверял).Итератор регулярных выражений не работает в Cpp

Я пытаюсь извлечь из 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; 
} 

однако, регулярное выражение не извлекая из самой группы. Вместо этого он просто плюет обратно на всю линию!

Я думал, что очень внимательно слежу за примерами, но, похоже, я не правильно использую regex_iterator.

1 - Как лучше всего можно извлечь IP из этой строки

(Side вопроса - есть функция C++, которая будет идти в сеть и получить IP-адрес от имени хоста так же, как ЬгасегЬ нашу пинту Еще что получите адрес макинтоша так же, как агр -a)

+0

Является ли MSVC единственным поставщиком доставка работает регулярное выражение библиотеки? – sehe

+1

Упростить. Чтобы убедиться, что регулярное выражение делает то, что вы хотите, подайте ему одну строку. Если это сработает, прокормите его чем-то более сложным. В этом коде также могут возникать проблемы, чтобы понять, что происходит, тем более, что нет указания того, что содержит текст, который подается в соединитель. –

ответ

3

Я не MSVC, и GNU сломалась станд :: регулярное выражение поддержки, поэтому я играл с `повышающего :: регулярное выражение» здесь:

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

Примечание:

  • не предполагающее являются пространством, а не символы табуляции
  • не предполагает точное расстояние в начале линии
  • делает мандат по крайней мере, 1 место после 1 характера (так он выиграл» т соответствует линии, начиная с 13, например)
  • если используется нежадным соответствия, где это возможно
#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 
+0

Ах! Что сказал трюк: '(* rit) [1] .str()' вместо просто rit-> str()! Благодаря! –

Смежные вопросы