Linux программирование в примерах
Часть 184 из 253 Информация о книге
• Когда в
включенcflags, то:REG_NEWLINE• Символ конца строки не соответствует '
' или дополненному списку символов..• Оператор
всегда соответствует положению непосредственно за вставленным символом конца строки независимо от установки^.REG_BOL• Оператор
всегда соответствует положению непосредственно перед вставленным символом конца строки независимо от установки$.REG_EOLКогда вы осуществляете построчный ввод/вывод, как в случае с
, можно не включатьgrepвREG_NEWLINE. Если в буфере несколько строк, и каждую из них нужно рассматривать как отдельную, с сопоставлениемcflagsи^, тогда следует включить$.REG_NEWLINEСтруктура
по большей части непрозрачна. Код уровня пользователя может исследовать лишь один член этой структуры; остальное предназначено для внутреннего использования процедурами регулярных выражений:regex_ttypedef struct {/* ...здесь внутренний материал... */size_t re_nsub;/* ...здесь внутренний материал... */} regex_t;В структуре
есть по крайней мере два члена для использования кодом уровня пользователя:regmatch_ttypedef struct {/* ...здесь возможный внутренний материал... */regoff_t rm_so; /* Смещение начала вложенной строки в байтах */regoff_t rm_eo; /* Смещение первого байта после вложенной строки *//* ...здесь возможный внутренний материал... */} regmatch_t;Как поле
, так и структураre_nsubпредназначены для сопоставления вложенных выражений. Рассмотрим такое регулярное выражение:regmatch_t[:пробел:]]+([[:цифра:]]+)[[:пробел:]]+([[:буква:]])+Каждое из двух вложенных выражений в скобках могут соответствовать одному или более символам. Более того, текст, соответствующий каждому вложенному выражению, может начинаться и заканчиваться в произвольных участках строки.
устанавливает в полеregcomp()число вложенных выражений в скобках внутри регулярного выражения,re_nsubзаполняет массивregexec()структурpmatchсмещениями начальных и конечных байтов текста, соответствующих этим вложенным выражениям. Вместе эти данные позволяют заменять текст — удалять его или заменять другим текстом, точно так же, как в текстовом редактореregmatch_tописывает часть строки, соответствующую всему регулярному выражению. Участок отpmatch[0]доpmatch[1]описывает ту часть, которая соответствует каждому вложенному выражению в скобках. (Таким образом, вложенные выражения нумеруются начиная с 1.) Элементыpmatch[preg->re_nsub]иrm_soне используемых элементов массиваrm_eoустановлены в -1.pmatchзаполняет не болееregexec()элементовnmatch-1; поэтому следует убедиться, что имеется по крайней мере на 1 элемент больше, чем вpmatch.preg->re_nsubНаконец, флаг
дляREG_NOSUBозначает, что начальная и завершающая информация не нужна. Этот флаг следует использовать, когда эти сведения не нужны; это потенциально может довольно значительно повысить производительностьregcomp().regexec()Другими словами, если все, что вам нужно знать, это «соответствует ли?», включите
. Однако, если нужно также знать, «где находится соответствующий текст?», этот флаг следует опустить.REG_NOSUBВ заключение, как
, так иregcomp()возвращают 0, если они успешны, или определенный код ошибки, если нет. Коды ошибок перечислены в табл. 12.9.regexec()Таблица 12.9. Коды ошибок
иregcomp()regexec()
Константа Значение REG_BADBRСодержимое ' ' недействительно.\{...\}REG_BADPATРегулярное выражение недействительно REG_BADRPTСимволу ,?или+не предшествует действительное регулярное выражение.*REG_EBRACEФигурные скобки (' ') не сбалансированы\{...\}REG_EBRACKКвадратные скобки (' ') не сбалансированы[...]REG_ECOLLATEВ шаблоне использован недействительный элемент сортировки REG_ECTYPEВ шаблоне использован недействительный класс символов REG_EESCAPEВ шаблоне есть завершающий символ \REG_EPARENГруппирующие скобки (' ' или '(...)') не сбалансированы\(...\)REG_ERANGEКонечная точка в диапазоне не действительна REG_ESPACEФункции не хватило памяти REG_ESUBREGЦифра в ' ' недействительна\<i>цифра</i>REG_NOMATCHСтрока не соответствует шаблону