Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

regex_split (deprecated)

Boost , Boost.Regex 5.1.2 , Deprecated Interfaces

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Алгоритм<regex_split>был обесценен в пользу итератора<regex_token_iterator>, который имеет более гибкий и мощный интерфейс, а также следует более обычной стандартной библиотеке «вытягивания», а не «толкания» семантики.

Код, который использует<regex_split>, будет продолжать компилироваться, следующая документация взята из предыдущего Boost. Версия Regex:

#include <boost/regex.hpp>

Алгоритм<regex_split>выполняет аналогичную операцию по разделению перла и имеет три перегруженные формы:

template <class OutputIterator, class charT, class Traits1, class Alloc1, class Traits2>
std::size_t regex_split(OutputIterator out,
                        std::basic_string<charT, Traits1, Alloc1>& s,
                        const basic_regex<charT, Traits2>& e,
                        boost::match_flag_type flags,
                        std::size_t max_split);
template <class OutputIterator, class charT, class Traits1, class Alloc1, class Traits2>
std::size_t regex_split(OutputIterator out,
                        std::basic_string<charT, Traits1, Alloc1>& s,
                        const basic_regex<charT, Traits2>& e,
                        boost::match_flag_type flags = match_default);
template <class OutputIterator, class charT, class Traits1, class Alloc1>
std::size_t regex_split(OutputIterator out,
                        std::basic_string<charT, Traits1, Alloc1>& s);

Эффекты: Каждая версия алгоритма принимает выходной идентификатор для вывода и строку для ввода. Если выражение не содержит помеченных подвыражений, то алгоритм записывает одну строку на выходной элемент для каждого участка ввода, который не соответствует выражению. Если выражение действительно содержит отмеченные суб-выражения, то каждый раз, когда будет найдено совпадение, одна строка для каждого отмеченного суб-выражения будет записана на выходной указатель. Не более max_split строк будет записываться на выходной элемент. Перед возвращением все обработанные входные данные будут удалены из строкиs(еслиmax_splitне достигнут, тогда всеsбудут удалены). Возвращает количество строк, записанных на выходной элемент. Если параметрmax_splitне указан, то он по умолчанию равен<UINT_MAX>. Если не указано никакого выражения, то оно по умолчанию «\s+», и разделение происходит в белом пространстве.

Бросает:<std::runtime_error>, если сложность сопоставления выражения со строкой символа N начинает превышать O (N2), или если программа исчерпает пространство стека при сопоставлении выражения (если увеличить). Regex настраивается в рекурсивном режиме, или если спичечный аппарат исчерпал свое разрешенное выделение памяти (если Boost). Regex настроен в нерекурсивном режиме.

Пример: Следующая функция разделит входную строку на ряд токенов и удалит каждый токен из строкиs:

unsigned tokenise(std::list<std::string>& l, std::string& s)
{
   return boost::regex_split(std::back_inserter(l), s);
}

Пример: следующая короткая программа извлекает все URL-адреса из html-файла и распечатывает их на кут:

#include <list>
#include <fstream>
#include <iostream>
#include <boost/regex.hpp>
boost::regex e("<\\s*A\\s+[^>]*href\\s*=\\s*\"([^\"]*)\"",
               boost::regbase::normal | boost::regbase::icase);
void load_file(std::string& s, std::istream& is)
{
   s.erase();
   //
   // attempt to grow string buffer to match file size,
   // this doesn't always work...
   s.reserve(is.rdbuf()-&gtin_avail());
   char c;
   while(is.get(c))
   {
      // use logarithmic growth strategy, in case
      // in_avail (above) returned zero:
      if(s.capacity() == s.size())
         s.reserve(s.capacity() * 3);
      s.append(1, c);
   }
}
int main(int argc, char** argv)
{
   std::string s;
   std::list<std::string> l;
   for(int i = 1; i < argc; ++i)
   {
      std::cout << "Findings URL's in " << argv[i] << ":" << std::endl;
      s.erase();
      std::ifstream is(argv[i]);
      load_file(s, is);
      boost::regex_split(std::back_inserter(l), s, e);
      while(l.size())
      {
         s = *(l.begin());
         l.pop_front();
         std::cout << s << std::endl;
      }
   }
   return 0;
}

PrevUpHomeNext

Статья regex_split (deprecated) раздела Boost.Regex 5.1.2 Deprecated Interfaces может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Deprecated Interfaces ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 19:26:50/0.028714895248413/1