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