REGCMP(1) REGCMP(1)
НАЗВАНИЕ
regcmp - компилятор регулярных выражений
СИНТАКСИС
regcmp [-] файл ...
ОПИСАНИЕ
Команда regcmp в большинстве случаев устраняет необхо-
димость использования системного вызова regcmp(3X) из
C-программ. Это уменьшает и время выполнения, и размер
программы. Команда regcmp компилирует регулярные выра-
жения, хранящиеся в файле, и помещает результат в
файл.i. Если используется опция -, результат помещается
в файл.c. Формат записей в файле - имя (C-переменная),
за которой следует один или более пробелов, а затем ре-
гулярное выражение в двойных кавычках.
Результат regcmp - текст на C. Скомпилированные регу-
лярные выражения представляются как векторы extern
char. Сформированные .i-файлы могут быть включены в C
программы, а .c-файлы могут быть откомпилированы и за-
тем загружены. В C-программе, которая использует ре-
зультат команды regcmp, функция regex (abc, line) со-
поставляет цепочку символов line с регулярным выражени-
ем, именуемым abc. Диагностические сообщения говорят
сами за себя.
ПРИМЕРЫ
name "([A-Za-z][A-Za-z0-9_]*)$0"
abc "\({0,1}([2-9][01][1-9])$0\){0,1} *"
"([2-9][0-9]{2})$1[ -]{0,1}"
"([0-9]{4})$2"
СМ. ТАКЖЕ
regcmp(3X).
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 вызывается многократно без
освобождения областей памяти, ставших ненужными.
|