Класс шаблона regex_token_iterator
является адаптером итератора; то есть он представляет новый вид существующей последовательности итераторов, перечисляя все случаи регулярного выражения в этой последовательности и представляя одну или несколько последовательностей символов для каждого найденного матча. Каждая позиция, перечисленная итератором, представляет собой объект sub_match
, который представляет то, что соответствовало конкретному субвыражению в обычном выражении. Когда класс regex_token_iterator
используется для перечисления одной суб-экспрессии с индексом -1, то итератор выполняет разделение поля: то есть он перечисляет одну последовательность символов для каждой секции последовательности символов, которая не соответствует обычному описанию.
template <class BidirectionalIterator,
class charT = iterator_traits<BidirectionalIterator>::value_type,
class traits = regex_traits<charT> >
class regex_token_iterator
{
public:
typedef basic_regex<charT, traits> regex_type;
typedef sub_match<BidirectionalIterator> value_type;
typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
typedef const value_type* pointer;
typedef const value_type& reference;
typedef std::forward_iterator_tag iterator_category;
regex_token_iterator();
regex_token_iterator(BidirectionalIterator a,
BidirectionalIterator b,
const regex_type& re,
int submatch = 0,
match_flag_type m = match_default);
regex_token_iterator(BidirectionalIterator a,
BidirectionalIterator b,
const regex_type& re,
const std::vector<int>& submatches,
match_flag_type m = match_default);
template <std::size_t N>
regex_token_iterator(BidirectionalIterator a,
BidirectionalIterator b,
const regex_type& re,
const int (&submatches)[N],
match_flag_type m = match_default);
regex_token_iterator(const regex_token_iterator&);
regex_token_iterator& operator=(const regex_token_iterator&);
bool operator==(const regex_token_iterator&)const;
bool operator!=(const regex_token_iterator&)const;
const value_type& operator*()const;
const value_type* operator->()const;
regex_token_iterator& operator++();
regex_token_iterator operator++(int);
};
typedef regex_token_iterator<const char*> cregex_token_iterator;
typedef regex_token_iterator<std::string::const_iterator> sregex_token_iterator;
#ifndef BOOST_NO_WREGEX
typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
typedef regex_token_iterator<<std::wstring::const_iterator> wsregex_token_iterator;
#endif
template <class charT, class traits>
regex_token_iterator<const charT*, charT, traits>
make_regex_token_iterator(
const charT* p,
const basic_regex<charT, traits>& e,
int submatch = 0,
regex_constants::match_flag_type m = regex_constants::match_default);
template <class charT, class traits, class ST, class SA>
regex_token_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits>
make_regex_token_iterator(
const std::basic_string<charT, ST, SA>& p,
const basic_regex<charT, traits>& e,
int submatch = 0,
regex_constants::match_flag_type m = regex_constants::match_default);
template <class charT, class traits, std::size_t N>
regex_token_iterator<const charT*, charT, traits>
make_regex_token_iterator(
const charT* p,
const basic_regex<charT, traits>& e,
const int (&submatch)[N],
regex_constants::match_flag_type m = regex_constants::match_default);
template <class charT, class traits, class ST, class SA, std::size_t N>
regex_token_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits>
make_regex_token_iterator(
const std::basic_string<charT, ST, SA>& p,
const basic_regex<charT, traits>& e,
const int (&submatch)[N],
regex_constants::match_flag_type m = regex_constants::match_default);
template <class charT, class traits>
regex_token_iterator<const charT*, charT, traits>
make_regex_token_iterator(
const charT* p,
const basic_regex<charT, traits>& e,
const std::vector<int>& submatch,
regex_constants::match_flag_type m = regex_constants::match_default);
template <class charT, class traits, class ST, class SA>
regex_token_iterator<
typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits>
make_regex_token_iterator(
const std::basic_string<charT, ST, SA>& p,
const basic_regex<charT, traits>& e,
const std::vector<int>& submatch,
regex_constants::match_flag_type m = regex_constants::match_default);
regex_token_iterator();
Эффекты: конструирует конец секвениратора.
regex_token_iterator(BidirectionalIterator a,
BidirectionalIterator b,
const regex_type& re,
int submatch = 0,
match_flag_type m = match_default);
Условия: !re.пустая()
. Объект re должен существовать на протяжении всего срока эксплуатации итератора, построенного из него.
Эффекты: конструирует regex_token_iterator
, который будет перечислять одну строку для каждого регулярного выражения совпадения выражения re, найденного в последовательности [a,b), используя флаги матчей m<> (см. match_flag_type
). Перечисленная строка - это подвыражение submatch для каждого найденного матча; если submatch является -1, то перечисляет все текстовые последовательности, которые не соответствовали экспрессии re (то есть выполняют разделение поля).
Throws: std::runtime_error
если сложность сопоставления выражения с строкой N начинает превышать O(N2), или если программа выходит из стека пространства при сопоставлении выражения (если Boost). Regex настроена в рекурсивном режиме), или если спикер исчерпал свое разрешенное распределение памяти (если увеличить. Regex настроен в нерекурсивном режиме).
regex_token_iterator(BidirectionalIterator a,
BidirectionalIterator b,
const regex_type& re,
const std::vector<int>& submatches,
match_flag_type m = match_default);
Условия: submatches.размер() && !re.пустое()
. Объект re должен существовать для срока службы построенного из него итератора.
Эффекты: конструкции regex_token_iterator
submatches.размер()
строки для каждого регулярного выражения совпадают с выражением re, найденным в последовательности [a,b), с использованием флагов матчей m (см. m_flag_type
). Для каждого матча будет перечислена одна строка для каждого индекса подвыражения, содержащегося в векторе подвечек; если submatches[0]
является -1, то первая строка, перечисленная для каждого матча, будет весь текст от конца последнего матча до начала текущего матча, кроме того, будет одна дополнительная строка, перечисленная, когда не будет найдено больше матчей: от конца последнего найденного матча до конца основной последовательности.
Throws: std::runtime_error
если сложность сопоставления выражения с строкой N начинает превышать O(N2), или если программа выходит из стека пространства при сопоставлении выражения (если Boost). Regex настроена в рекурсивном режиме), или если спикер исчерпал свое разрешенное распределение памяти (если увеличить. Regex настроен в нерекурсивном режиме).
template <std::size_t N>
regex_token_iterator(BidirectionalIterator a,
BidirectionalIterator b,
const regex_type& re,
const int (&submatches)[R],
match_flag_type m = match_default);
Условия: !re.пустая()
. Объект re должен существовать на протяжении всего срока эксплуатации итератора, построенного из него.
Эффекты: конструирует regex_token_iterator
, который будет перечислять R строки для каждого регулярного выражения совпадают с выражением re, найденным в последовательности [a,b), используя флаги матчей m (см. match_flag_type
). Для каждого матча будет перечислена одна строка для каждого индекса подвыражения, содержащегося в подписи массив; если подписи<335>[0<335>] является -1, то первая строка, перечисленная для каждого матча, будет весь текст от конца последнего матча до начала текущего матча, кроме того, будет одна дополнительная строка, перечисленная, когда не будет найдено больше матчей: от конца последнего найденного матча, до конца основной последовательности.
Throws: std::runtime_error
если сложность сопоставления выражения с строкой N начинает превышать O(N2), или если программа выходит из стека пространства при сопоставлении выражения (если Boost). Regex настроена в рекурсивном режиме), или если спикер исчерпал свое разрешенное распределение памяти (если увеличить. Regex настроен в нерекурсивном режиме).
regex_token_iterator(const regex_token_iterator& that);
Следы: строит копию что
.
Почтовые условия: *это == это
.
regex_token_iterator& operator=(const regex_token_iterator& that);
Effects: sets * this
to be equal to that
.
Почтовые условия: *это == это
.
bool operator==(const regex_token_iterator&)const;
Effects: возвраты верны, если *это
такое же положение, как что
.
bool operator!=(const regex_token_iterator&)const;
Следы: возврат !(*это == это)
.
const value_type& operator*()const;
Следы: возвращает текущую последовательность символов.
const value_type* operator->()const;
Effects: returns &(*This)
.
regex_token_iterator& operator++();
Effects: Перемещается в следующую последовательность символов, которые будут перечислены.
Throws: std::runtime_error
если сложность сопоставления выражения с строкой N начинает превышать O(N2), или если программа выходит из стека пространства при сопоставлении выражения (если Boost). Regex настроена в рекурсивном режиме), или если спикер исчерпал свое разрешенное распределение памяти (если увеличить. Regex настроен в нерекурсивном режиме).
Возвращения: *это
.
regex_token_iterator& operator++(int);
Эффекты: конструирует результат копии *<37>это
, затем вызывает ++(*это)
.
Возвращения: результат.
template <class charT, class traits>
regex_token_iterator<const charT*, charT, traits>
make_regex_token_iterator(
const charT* p,
const basic_regex<charT, traits>& e,
int submatch = 0,
regex_constants::match_flag_type m = regex_constants::match_default);
template <class charT, class traits, class ST, class SA>
regex_token_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits>
make_regex_token_iterator(
const std::basic_string<charT, ST, SA>& p,
const basic_regex<charT, traits>& e,
int submatch = 0,
regex_constants::match_flag_type m = regex_constants::match_default);
template <class charT, class traits, std::size_t N>
regex_token_iterator<const charT*, charT, traits>
make_regex_token_iterator(
const charT* p,
const basic_regex<charT, traits>& e,
const int (&submatch)[N],
regex_constants::match_flag_type m = regex_constants::match_default);
template <class charT, class traits, class ST, class SA, std::size_t N>
regex_token_iterator<
typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits>
make_regex_token_iterator(
const std::basic_string<charT, ST, SA>& p,
const basic_regex<charT, traits>& e,
const int (&submatch)[N],
regex_constants::match_flag_type m = regex_constants::match_default);
template <class charT, class traits>
regex_token_iterator<const charT*, charT, traits>
make_regex_token_iterator(
const charT* p,
const basic_regex<charT, traits>& e,
const std::vector<int>& submatch,
regex_constants::match_flag_type m = regex_constants::match_default);
template <class charT, class traits, class ST, class SA>
regex_token_iterator<
typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits>
make_regex_token_iterator(
const std::basic_string<charT, ST, SA>& p,
const basic_regex<charT, traits>& e,
const std::vector<int>& submatch,
regex_constants::match_flag_type m = regex_constants::match_default);
Эффекты: возвратит regex_token_iterator
, который перечисляет один 6>sub_match
для каждого значения в submatch для каждого случая регулярного выражения e в строке p, сопоставлено с >>.
Следующий пример берет строку и разделяет ее на ряд токенов:
#include <iostream>
#include <boost/regex.hpp>
using namespace std;
int main(int argc)
{
string s;
do{
if(argc == 1)
{
cout << "Enter text to split (or \"quit\" to exit): ";
getline(cin, s);
if(s == "quit") break;
}
else
s = "This is a string of tokens";
boost::regex re("\\s+");
boost::sregex_token_iterator i(s.begin(), s.end(), re, -1);
boost::sregex_token_iterator j;
unsigned count = 0;
while(i != j)
{
cout << *i++ << endl;
count++;
}
cout << "There were " << count << " tokens found." << endl;
}while(argc == 1);
return 0;
}
Следующий пример берет html-файл и выводит список всех связанных файлов:
#include <fstream>
#include <iostream>
#include <iterator>
#include <boost/regex.hpp>
boost::regex e("<\\s*A\\s+[^>]*href\\s*=\\s*\"([^\"]*)\"",
boost::regex::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;
int i;
for(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::sregex_token_iterator i(s.begin(), s.end(), e, 1);
boost::sregex_token_iterator j;
while(i != j)
{
std::cout << *i++ << std::endl;
}
}
for(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);
const int subs[] = {1, 0,};
boost::sregex_token_iterator i(s.begin(), s.end(), e, subs);
boost::sregex_token_iterator j;
while(i != j)
{
std::cout << *i++ << std::endl;
}
}
return 0;
}