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, возлагается на пользователя. Пустой указатель NULL, возвращенный в качестве результата regcmp, свидетельствует о некорректности аргументов. Чтобы, в общем случае, устранить необходимость вызова данной функции во время выполнения, написана команда .
Функция regex сопоставляет скомпилированный образец с цепочкой символов subject. Regex возвращает пустой указатель NULL в случае неудачи или указатель на символ, следующий после сопоставленного фрагмента, в случае успеха. Если нужно получить больше выходной информации, следует передать дополнительные аргументы. В глобальной переменной __loc1 возвращается указатель на позицию, где сопоставление началось. Функции regcmp и regex почти впрямую заимствованы из редактора ; синтаксис и семантика регулярных выражений изменены незначительно. Ниже перечислены допустимые символы и описана их трактовка.
[ ] * . ^
Эти символы сохраняют свой обычный для смысл.
$ Этот символ сопоставляется с концом цепочки символов; \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.
Все определенные выше символы по необходимости трактуются особым образом. Чтобы обозначать самих себя, они должны экранироваться символом \.
ПРИМЕРЫ
В данном примере будет сопоставлен символ перевода строки, стоящий в начале цепочки символов, на которую указывает аргумент cursor:
char *cursor, *newcursor, *ptr; ... newcursor = regex((ptr = regcmp("^\n", (char *)0)), cursor); free (ptr);
В следующем примере будет сопоставлена цепочка символов "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);
Предварительно скомпилированное регулярное выражение из файла file.i [см. ] будет применено к аргументу string:
#include "file.i" char *string, *newcursor; ... newcursor = regex (name, string);
ФАЙЛЫ
/usr/lib/libPW.a Библиотека, в которой хранятся описанные функции.
СМ. ТАКЖЕ
.
, в Справочнике пользователя.
СЮРПРИЗЫ
При работе программы пользователя может произойти переполнение памяти, если regcmp вызывается многократно без освобождения областей памяти, ставших ненужными.
Содержание раздела