Определены в типах 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 {
//
//
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.