Алгоритм<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();
s.reserve(is.rdbuf()->in_avail());
char c;
while(is.get(c))
{
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;
}