REGCMP(3X) REGCMP(3X) НАЗВАНИЕ regcmp, regex - компиляция и выполнение регулярного вы- ражения СИНТАКСИС |char *regcmp (string1 [, string2, ...], (char *) 0) |char *string1, *string2, ...; | |char *regex (re, subject [, ret0, ...]) |char *re, *subject, *ret0, ...; | |extern char *__loc1; ОПИСАНИЕ Функция regcmp компилирует регулярное выражение, состо- ящее из конкатенированных аргументов, и возвращает ука- затель на результат компиляции. Чтобы захватить прост- ранство для результата, используется функция malloc(3C). Ответственность за освобождение ставшего ненужным пространства, которое было выделено при помощи malloc, возлагается на пользователя. Пустой указатель NULL, возвращенный в качестве результата regcmp, свиде- тельствует о некорректности аргументов. Чтобы, в общем случае, устранить необходимость вызова данной функции во время выполнения, написана команда regcmp(1). Функция regex сопоставляет скомпилированный образец с цепочкой символов subject. Regex возвращает пустой ука- затель NULL в случае неудачи или указатель на символ, следующий после сопоставленного фрагмента, в случае ус- пеха. Если нужно получить больше выходной информации, следует передать дополнительные аргументы. В глобальной переменной __loc1 возвращается указатель на позицию, где сопоставление началось. Функции regcmp и regex поч- ти впрямую заимствованы из редактора ed(1); синтаксис и семантика регулярных выражений изменены незначительно. Ниже перечислены допустимые символы и описана их трак- товка. |[ ] * . ^ Эти символы сохраняют свой обычный для ed(1) смысл. $ Этот символ сопоставляется с концом цепочки симво- лов; \n сопоставляется с символом перевода строки. - Минус в квадратных скобках обозначает "от и до". Например, запись [a-z] эквивалентна [abcd...xyz]. Минус может встречаться сам по себе, только если он является первым или последним символом. Напри- мер, класс символов [ ]-] сопоставляется с симво- лами ] и -. + Плюс, следующий за регулярным выражением, обозна чает "один или более раз". Например, запись [0-9]+ эквивалентна [0-9][0-9]*. |{m} {m,} {m, u} Целые значения, заключенные в фигурные скобки, указывают, сколько раз должно применяться пред- шествующее регулярное выражение. Минимальное число применений задается величиной m, максимальное - величиной u, которая должно быть меньше, чем 256. Если указано только значение {m}, оно обозначает точное число применений регулярного выражения. За- пись {m,} эквивалентна {m, бесконечность}. Опера- ции + и * эквивалентны соответственно {1,} и {0,}. ( ... )$n Значение регулярного выражения в скобках должно быть возвращено. Значение заносится в (n+1)-й ар- гумент после subject. В текущей версии допускается максимум 10 таких регулярных выражений. Данные присваивания выполняются безусловно. ( ... ) Круглые скобки используются для группировки. Опе- ратор (например, *, +, { }) может работать с одним символом или с регулярным выражением, заключенным в скобки. Например, (a*(cb+)*)$0. Все определенные выше символы по необходимости тракту- ются особым образом. Чтобы обозначать самих себя, они должны экранироваться символом \. ПРИМЕРЫ 1. В данном примере будет сопоставлен символ перевода строки, стоящий в начале цепочки символов, на которую указывает аргумент cursor: |char *cursor, *newcursor, *ptr; | ... |newcursor = | regex((ptr = regcmp("^\n", (char *)0)), cursor); |free (ptr); 2. В следующем примере будет сопоставлена цепочка сим- волов "Testing3" и возвращен адрес после последнего со- поставленного символа (адрес символа "4"). Цепочка "Testing3" будет скопирована в массив ret0. |char ret0 [9]; |char *newcursor, *name; | ... |name = regcmp ("([A-Za-z][A-za-z0-9]{0,7})$0", | (char *) 0); |newcursor = regex (name, "012Testing345", ret0); 3. Предварительно скомпилированное регулярное выражение из файла file.i [см. regcmp(1)] будет применено к аргу- менту string: |#include "file.i" |char *string, *newcursor; | ... |newcursor = regex (name, string); ФАЙЛЫ /usr/lib/libPW.a Библиотека, в которой хранятся описанные функции. СМ. ТАКЖЕ malloc(3C). ed(1), regcmp(1) в Справочнике пользователя. СЮРПРИЗЫ При работе программы пользователя может произойти пере- полнение памяти, если regcmp вызывается многократно без освобождения областей памяти, ставших ненужными.