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