next up previous contents
Next: Структура LEX-программы Up: LEX - лексический анализатор Previous: Команда lex   Contents

Регулярные выражения

В LEX-программе регулярные выражения используются для определения лексем. (Кроме того, регулярные выражения широко используются при описании синтаксиса команд в разделах помощи UNIX-систем). Ниже приводится полное описание регулярных выражений применительно к LEX.

Регулярное выражение может содержать буквы латинского и русского алфавитов в верхнем и нижнем регистрах, цифры, знаки препинания и т.д. (литеральные символы), а также символы-операторы (метасимволы). Кроме того, в регулярных выражениях можно использовать управляющие символы потока stdout языка Си, например:

\восьмеричный код - указание символа его восьмеричным кодом;

\xшестнадцатеричный код - указание символа его шестнадцатеричным кодом;

\n - символ новой строки;

\t - символ табуляции;

\b - возврат курсора на один шаг назад.

В данном разделе понятие ``символ'' используется в смысле языка программирования Си, т.е. подразумевается прежде всего литеральный символ. Операторы позволяют расширить возможности для описания цепочек символов. Регулярные выражения допускают использование операций конкатенации, т.е., ``стыковки'' друг с другом. Если в выражении используется символ пробела и он не находится внутри квадратных скобок, то его необходимо экранировать по правилам, описанным ниже, так как пробел и табуляция используются в качестве разделителей внутри LEX-программы.

Операторы обозначаются символами-операторами, к которым относятся:

\ "" . [] - * + / | ? $ ^ {} <> () Каждый из этих символов или пар скобок в регулярном выражении играет свою роль:

  1. \ и "" - операторы экранирования. Используются для отмены специального значения символа, обозначающего оператор, либо последовательности таких символов.
    \c - отменяет специальное значение символа c. В общем случае c может быть любым символом (в том числе и ), кроме цифры и скобки (т.е. специальное значение скобок таким способом отменить нельзя).
    "сс" - отменяет специальное значение последовательности символов c. В общем случае в двойные кавычки можно заключать любую последовательность символов, но специальное значение таким способом отменить нельзя.
    Примеры:
    abc+ ,где + является символом-оператором, а в выражении
    abc\+ специальное значение + отменяется.
  2. . - оператор выделения произвольного символа.
    . - означает вхождение любого символа, кроме символа новой строки n.
  3. [] - оператор выделения символа из определенного класса. Используется для определения вхождения одного любого символа из числа заключенных в квадратные скобки. Заключение символа в квадратные скобки также выполняет роль экранирования. Квадратные скобки внутри квадратных скобок также теряют свой специальный смысл.
    [xy] - означает вхождение либо символа x, либо символа y.
    [x-z] - означает вхождение любого символа из лексикографически упорядоченной последовательности от x до z.
    Примеры:
    [A-z]
    выделяет любой латинский символ, а
    [+-0-9]
    означает все цифры и знаки + и -.
  4. * и + - операторы-повторители. Используются, когда необходимо указать повторяемость вхождения символа или класса символов в регулярном выражении.
    x* - означает любое (в том числе и нулевое) число вхождений символа x.
    x+ - означает одно и более вхождений символа x.
    Примеры:
    [A-z]*
    выделяет любое количество любых латинских букв, а
    [A-ZА-Яa-zа-я0-9]*
    выделяет любое количество русских и латинских букв, знаков подчеркивания и цифр.
    [A-z]+
    выделяет одну любую латинскую букву или более.
  5. /, |, ?, $, ^ - операторы выбора. Управляют процессом выбора символов.
    x/y - означает, что вхождение x учитывается только тогда, когда за ним следует y.
    x|y - означает или x, или y.
    x? - означает необязательность вхождения символа x.
    x$ - означает учет вхождения символа x, если он является последним в строке (cтоит перед символом n).
    ^x - означает учет вхождения символа x, если он является первым символом строки.
    [^x] - означает вхождение любого символа, кроме x. Внутри квадратных скобок ^ должен обязательно стоять первым.
    Примеры:
    _?[A-Za-z]*
    выделяет цепочку из любого количества латинских букв, перед которой может быть необязательный символ подчеркивания.
    -?[0-9]+
    выделяет любое целое число с необязательным минусом впереди.
    ^[A-Z]
    выделяет цепочку из любых символов, кроме прописных латинских букв.
  6. {} - оператор имеет два различных применения:
    x{n,m} - означает от n до m вхождений x (здесь n и m натуральные, m > n).
    {имя} - означает, что вместо имени в данное место выражения будет подставлено определение имени из области определений LEX-программы.
    Пример:
    a{2,7}
    выделяет от 2 до 7 вхождений a.
  7. <> - оператор используется для учета состояния ЛА при определении вхождений.
    <состояние>x - означает учет вхождения x, если ЛА находится в положении "состояние".
  8. () - оператор изменения группировки регулярного выражения. Все перечисленные выше операторы имеют соответствующим образом определенные приоритеты. Заключение в круглые скобки позволяет необходимым способом изменить приоритеты для правильного описания входной информации.
Регулярные выражения, которые описываются с помощью операторов +, /, |, ?, , <> и (), принято называть расширенными регулярными выражениями.



2004-06-22