Эти операции применимы также к итераторам cregex_iterator , wsregex_iterator и wcregex_iterator | |
---|---|
sregex_iterator it(b, e, r); | it — это итератор sregex_iterator , перебирающий строку, обозначенную итераторами b и е . Вызов regex_search(b, е, r) устанавливает итератор it на первое соответствие во вводе |
sregex_iterator end; | Итератор sregex_iterator , указывающий на позицию после конца |
*it it-> | Возвращает ссылку на объект класса smatch или указатель на объект класса smatch от самого последнего вызова функции regex_search() |
++it it++ | Вызывает функцию regex_search() для исходной последовательности, начиная сразу после текущего соответствия. Префиксная версия возвращает ссылку на приращенный итератор, а постфиксная возвращает прежнее значение |
it1 == it2 it1 != it2 | Два итератора sregex_iterator равны, если оба они итераторы после конца. Два не конечных итератора равны, если они созданы из той же исходной последовательности и объекта класса regex |
sregex_iterator
В качестве примера дополним программу поиска нарушения правила "file
класса string
содержит все содержимое исходного файла, на котором осуществляется поиск. Новая версия программы будет использовать ту же схему, что и ранее, но для поиска применим итератор sregex_iterator
:
//
string pattern("[^с]ei");
//
pattern = "[[:alpha:]]*" + pattern + "[[ :alpha:]]*";
regex r(pattern, regex::icase); //
//
//
//
for (sregex_iterator it(file.begin(), file.end(), r), end_it;
it != end_it; ++it)
cout << it->str() << endl; //
Цикл for
перебирает все соответствия r
в строке file
. Инициализатор в цикле for
определяет итераторы it
и end_it
. При определении итератора it
конструктор sregex_iterator()
вызывает функцию regex_search()
для позиционирования итератора it
на первое соответствие в строке file
.
Пустой итератор sregex_iterator
, end_it
действует как итератор после конца. Приращение в цикле for
"перемещает" итератор, вызвав функцию regex_search()
. При обращении к значению итератора возвращается объект класса smatch
, представляющий текущее соответствие. Для вывода соответствующего слова вызывается функция-член str()
.
Данный цикл for
как бы перепрыгивает с одного соответствия на другое, как показано на рис. 17.1.
Рис. 17.1. Использование итератора sregex_iterator
Если запустить этот цикл для строки test_str
из первоначальной программы, вывод был бы таким:
freind
theif
Однако вывод только самого слова, соответствующего заданному выражению, не очень полезен. При запуске программы для большой исходной последовательности, например для текста этой главы, имело бы смысл увидеть контекст, в котором встретилось слово. Например:
hey read or write according to the type
>>> being <<<
handled. The input operators ignore whi
Кроме возможности вывода части исходной строки, в которой встретилось соответствие, классы соответствия предоставляют более подробную информацию о соответствии. Возможные операции с этими типами перечислены в табл. 17.10 и 17.11.