Типы соответствий и итераторов (они рассматриваться в следующих разделах) более специфичны. Они отличаются не только типом символов, но и тем, является ли последовательность библиотечным типом или массивом: класс smatch
представляет исходные последовательности типа string
; класс cmatch
— символьные массивы; wsmatch
— строки Unicode (wstring
); wcmatch
— массивы символов wchar_t
.
Таблица 17.8. Библиотечные классы регулярных выражений
Тип исходной последовательности | Используемый класс регулярного выражения |
---|---|
string | regex , smatch , ssub_match и sregex_iterator |
const char* | regex , cmatch , csub_match и cregex_iterator |
wstring | wregex , wsmatch , wssub_match и wsregex_iterator |
const wchar_t* | wregex , wcmatch , wcsub_match и wcregex_iterator |
Важный момент: используемый тип библиотеки RE должен соответствовать типу исходной последовательности. Соответствие классов видам исходных последовательностей приведено в табл. 17.8. Например:
regex r("[[:alnum:]]+\\.(cpp|схх|cc)$", regex::icase);
smatch results; //
//
if (regex_search("myfile.cc", results, r)) //
cout << results.str() << endl;
Компилятор С++ отклонит этот код, поскольку тип аргумента и тип исходной последовательности не совпадают. Если необходимо искать в символьном массиве, то следует использовать объект класса cmatch
:
cmatch results; //
//
if (regex_search("myfile.cc", results, r))
cout << results.str() << endl; //
Обычно программы используют исходные последовательности типа string
и соответствующие ему версии компонентов библиотеки RE.
Упражнение 17.14. Напишите несколько регулярных выражений, предназначенных для создания различных ошибок. Запустите программу и посмотрите, какие сообщения выводит ваш компилятор для каждой ошибки.
Упражнение 17.15. Напишите программу, используя схему поиска слов, нарушающих правило "
Упражнение 17.16. Что будет при инициализации объекта класса regex
в предыдущей программе значением "[^c]ei"
? Проверьте свою программу, используя эту схему, и убедитесь в правильности своих ожиданий.
17.3.2. Типы итераторов классов соответствия и regex
Программа проверки правила "sregex_iterator
, можно получить все соответствия. Итераторы класса regex
являются адаптерами итератора (см. раздел 9.6), привязанные к исходной последовательности и объекту класса regex
. Как было описано в табл. 17.8, для каждого типа исходной последовательности используется специфический тип итератора. Операции с итераторами описаны в табл. 17.9.
Когда итератор sregex_iterator
связывается со строкой и объектом класса regex
, итератор автоматически позиционируется на первое соответствие в заданной строке. Таким образом, конструктор sregex_iterator()
вызывает функцию regex_search()
для данной строки и объекта класса regex
. При обращении к значению итератора возвращается объект класса smatch
, соответствующий результатам самого последнего поиска. При приращении итератора для поиска следующего соответствия в исходной строке вызывается функция regex_search()
.
Таблица 17.9. Операции с итератором sregex_iterator