Unix Man (Справочное руководство)

         

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 вызывается многократно без освобождения областей памяти, ставших ненужными.


    Содержание раздела