Типы соответствий и итераторов (они рассматриваться в следующих разделах) более специфичны. Они отличаются не только типом символов, но и тем, является ли последовательность библиотечным типом или массивом: класс 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