Типы соответствий и итераторов (они рассматриваться в следующих разделах) более специфичны. Они отличаются не только типом символов, но и тем, является ли последовательность библиотечным типом или массивом: класс smatch представляет исходные последовательности типа string; класс cmatch — символьные массивы; wsmatch — строки Unicode (wstring); wcmatch — массивы символов wchar_t.

Таблица 17.8. Библиотечные классы регулярных выражений

Тип исходной последовательностиИспользуемый класс регулярного выражения
stringregex, smatch, ssub_match и sregex_iterator
const char*regex, cmatch, csub_match и cregex_iterator
wstringwregex, 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; // будет соответствовать последовательности типа

                // string, но не char*

if (regex_search("myfile.cc", results, r)) // ошибка: ввод char*

 cout << results.str() << endl;

Компилятор С++ отклонит этот код, поскольку тип аргумента и тип исходной последовательности не совпадают. Если необходимо искать в символьном массиве, то следует использовать объект класса cmatch:

cmatch results; // будет соответствовать последовательности символьного

                // массива

if (regex_search("myfile.cc", results, r))

 cout << results.str() << endl; // вывод текущего соответствия

Обычно программы используют исходные последовательности типа string и соответствующие ему версии компонентов библиотеки RE.

Упражнения раздела 17.3.1

Упражнение 17.14. Напишите несколько регулярных выражений, предназначенных для создания различных ошибок. Запустите программу и посмотрите, какие сообщения выводит ваш компилятор для каждой ошибки.

Упражнение 17.15. Напишите программу, используя схему поиска слов, нарушающих правило "i перед е, кроме как после c". Организуйте приглашение для ввода пользователем слова и вывод результата его проверки. Проверьте свою программу на примере слов, которые нарушают и не нарушают это правило.

Упражнение 17.16. Что будет при инициализации объекта класса regex в предыдущей программе значением "[^c]ei"? Проверьте свою программу, используя эту схему, и убедитесь в правильности своих ожиданий.

<p>17.3.2. Типы итераторов классов соответствия и <code>regex</code></p>

Программа проверки правила "i перед е, кроме как после с" из раздела 17.3.1 выводила только первое соответствие в исходной последовательности. Используя итератор 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

Перейти на страницу:

Похожие книги