Определены в типах regex и regex_constants::syntax_option_type
error_collateНедопустимый запрос объединения элементов
error_ctypeНедопустимый класс символов
error_escapeНедопустимый управляющий или замыкающий символ
error_backrefНедопустимая обратная ссылка
error_brackНесоответствие квадратных скобок ([ или ])
error_parenНесоответствие круглых скобок (( или ))
error_braceНесоответствие фигурных скобок ({ или })
error_badbraceНедопустимый диапазон в фигурных скобках ({})
error_rangeНедопустимый диапазон символов (например, [z-a])
error_spaceНедостаточно памяти для выполнения этого регулярного выражения
error_badrepeatПовторяющийся символ (*?, + или {) не предваряется допустимым регулярным выражением
error_complexityЗатребованное соответствие слишком сложно
error_stackНедостаточно памяти для вычисления соответствия

Например, в схеме вполне можно пропустить по неосторожности скобку:

try {

 // ошибка: пропущена закрывающая скобка после alnum; конструктор

 // передаст исключение

 regex r("[[:alnum:]+\\.(cpp|схх|cc)$", regex::icase);

 } catch (regex_error e)

 { cout << e.what() << "\ncode: " << e.code() << endl; }

При запуске на системе авторов эта программа выводит следующее:

regex_error(error_brack):

The expression contained mismatched [ and ].

code: 4

Компилятор определяет функцию-член code() для возвращения позиции ошибок, перечисленных в табл. 17.7, счет которых, как обычно, начинается с нуля.

Совет. Избегайте создания ненужных регулярных выражений

Как уже упоминалось, представляющая регулярное выражение "программа" компилируется во время выполнения, а не во время компиляции. Компиляция регулярного выражения может быть на удивление медленной операцией, особенно если используется расширенная грамматика регулярного выражения или выражение слишком сложно. В результате создание объекта класса regex и присвоение нового регулярного выражения уже существующему объекту класса regex может занять много времени. Для минимизации этих дополнительных затрат не создавайте больше объектов класса regex, чем необходимо. В частности, если регулярное выражение используются в цикле, его следует создать вне цикла, избежав перекомпиляции при каждой итерации.

Классы регулярного выражения и тип исходной последовательности

Поиск возможен в любой из исходных последовательностей нескольких типов. Входные данные могут быть обычными символами типа char или wchar_t, и эти символы могут храниться в библиотечной строке или в массиве символов (или в его версии для wchar_t, или wstring). Библиотека RE определяет отдельные типы, соответствующие этим разным типам исходных последовательностей.

Предположим, например, что класс regex содержит регулярное выражение типа char. Для типа wchar_t библиотека определяет также класс wregex, поддерживающий все операции класса regex. Единственное различие в том, что инициализаторы класса wregex должны использовать тип wchar_t вместо типа char.

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

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