C ++, boost: какой самый быстрый способ разобрать строку вроде tcp: // adr: port / в адресную строку и один int для порта? - PullRequest
1 голос
/ 18 ноября 2010

у нас есть std :: string A с tcp://adr:port/ Как разобрать его в адрес std :: string и один int для порта?

Ответы [ 5 ]

9 голосов
/ 18 ноября 2010

Хотя некоторые не считают это особенно кошерным C ++, вероятно, самый простой способ - использовать sscanf:

sscanf(A.c_str(), "tcp://%[^:]:%d", &addr, &port);

Другой возможностью было бы поместить строку в поток строк, наполнить поток фасетом, который обрабатывает большинство букв и знаков препинания как пробел, и просто прочитать адрес и порт как:

std::istringstream buffer(A);
buffer.imbue(new numeric_only);
buffer >> addr >> port;

Фаска будет выглядеть примерно так:

struct digits_only: std::ctype<char> 
{
    digits_only(): std::ctype<char>(get_table()) {}

    static std::ctype_base::mask const* get_table()
    {
        // everything is white-space:
        static std::vector<std::ctype_base::mask> 
            rc(std::ctype<char>::table_size,std::ctype_base::space);

        // except digits, which are digits
        std::fill(&rc['0'], &rc['9'], std::ctype_base::digit);

        // and '.', which we'll call punctuation:
        rc['.'] = std::ctype_base::punct;
        return &rc[0];
    }
};

operator>> рассматривает пробел как разделитель между «полями», поэтому он будет обрабатывать что-то вроде 192.168.1.1:25 как две строки: «192.168.1.1» и «25».

4 голосов
/ 18 ноября 2010
void extract(std::string const& ip, std::string& address, std::string& service)
{
   boost::regex e("tcp://(.+):(\\d+)/");
   boost::smatch what;
   if(boost::regex_match(ip, what, e, boost::match_extra))
   {
     boost::smatch::iterator it = what.begin();
     ++it; // skip the first entry..
     address = *it;
     ++it;
     service = *it;
   }
}

РЕДАКТИРОВАТЬ: причина службы это строка здесь, что вам понадобится в качестве строки для распознавателя!;)

2 голосов
/ 18 ноября 2010

Самый быстрый, как в компьютерное время или время программиста? Я не могу говорить о тестах, но библиотека uri в фреймворке cpp-netlib работает очень хорошо и очень проста и понятна в использовании.

http://cpp -netlib.github.com / 0,8-бета / uri.html

1 голос
/ 18 ноября 2010

Вы можете использовать такой инструмент, как re2c , чтобы создать быстрый пользовательский сканер. Мне также неясно, что вы считаете "самым быстрым" - для процессора или времени разработки, или для того и другого?

0 голосов
/ 30 августа 2017

В настоящее время можно также встретить адреса IPv6 с хост-частью, которая уже содержит переменное количество двоеточий и точек. Разделение URL-адресов должно быть выполнено следующим образом: RFC3986 . См. Википедия IPv6

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