REGEX(7) REGEX(7)
НАЗВАНИЕ
regex - регулярные выражения стандарта POSIX 1003.2
ОПИСАНИЕ
Регулярные выражения (``РВ'') стандарта POSIX 1003.2 могут
быть двух видов: новые РВ (по сути, это вызовы egrep;
версия #1003.2 называет их еще ``дополнительными'' РВ) и
абсолютные РВ (по сути, вызовы ed(1); стандарт 1003.2
называет их еще ``основными'' РВ). Абсолютные РВ
существуют в старых программах для совместимости их с
предыдущими программными версиями (они будут подробнее
рассмотрены в конце этого документа). 1003.2 не
разъясняет некоторые вопросы синтаксиса РВ; знаком`(!)'
отмечается описание функций, которые не могут быть внесены
в другие версии 1003.2).
Новые РВ -одна(!) или более "непустых"(!) ветвей,
разделенных `|'. Эта большая ветвь ведет любых
соответствий одной из своих ветвей.
Ветвь состоит из одной(!) или более частей. Ветвь сначала
ведет соответствий первой, затем второй (и т.д.) ее
частям.
Часть - это атом, за которым может следовать символ(!)
`*', `+', `?', или интервал. Если за атомом следует
символ `*', это означает, что данный атом может
повторяться 0 или более раз. Если за атомом следует
символ `+', это означает, что данный атом может
повторяться 1 или более раз. Если за атомом следует
символ `?', это означает, что данный атом может
повторяться 0 или 1 раз.
Интервал - это символ `{', после которого стоит
положительное целое десятичное число, за которым может
следовать символ `,', далее, возможно, находится еще одно
положительное целое десятичное число, и в конце интервала
обязательно стоит символ `}'. Число должно находиться в
промежутке от нуля до RE_DUP_MAX (255(!)) включительно, а
если это два числа, то первое не должно превышать второе.
Атом с интервалом, в котором есть одно число i и нет
запятой, ведет последовательности только с числом
i. Атом с интервалом, содержащим число i и запятую, ведет
чисел, соответствующих числу i и другим числам
данного атома. Атом с интервалом, содержащим два числа i
и j, ведет числовых соответствий в диапазоне от i до
j включительно.
Атом - это регулярное выражение, заключенное в `()'
(соответствующее регулярному выражению), пустые скобки
`()' (соответствуют нулевой строке)(!), выражение в
квадратных скобках (см. ниже), `.' (соответствует любому
одному символу), `^' (соответствует пустой строке в начале
строки), `$' (соответствует пустой строке в конце строки),
символ `\' со следующим после него одним из символов
`^.[$()|*+?{\' (соответствует этому символу, как он есть),
символ `\' с последующим символом, отличным от предыдущих
(!) (соответствует этим символам, как они есть, как если
бы `\' не применялся(!)); or a single character with no
other significance (matching that character). Символ `{'
с последующим символом, не являющимся цифрой,
соответствует символу, а не началу интервала(!). Нельзя
заканчивать РВ символом `\'.
Выражение в квадратных скобках является списком символов,
заключенных в `[]'. Оно соответствует любому отдельному
символу из списка. Если список начинается с `^', то он
соответствует любому отдельному символу (см. ниже) не из
приведенного списка. Если два символа в списке разделены
`-', то это сокращение означает полный интервал символов,
заключенных в эти два (включая и их), например, `[0-9]' в
кодах ASCII соответствует любой десятичной цифре. Нельзя
(!) для двух интервалов иметь один и тот же общий символ,
например, `a-c-e'. Эти интервалы, по возможности, не
должны использоваться в переносимых программах.
Для того, чтобы включить в список символ `]' , Вам следует
поставить его в начало списка (после символа `^', если он
присутствует). Для того, чтобы включить в список символ
`-', поставьте его первым или последним в интервале
символов. Для того, чтобы обозначить символом `-' начало
интервала, заключите его в `[.' и `.]'. За исключением
некоторых комбинаций, использующих `[' (см. следующие
части), все другие специальные символы, включая `\',
теряют их особое назначение в квадратных скобках.
Если внутри квадратных скобок элемент сортировки заключен
в `[.' и `.]', то он обозначает последовательность
символов как один элемент сортировки. Последовательностью
называется элемент списка внутри квадратных скобок. Таким
образом, выражение в скобках, содержащее многосимвольный
элемент сортировки, может соответствовать более чем одному
символу; например, если последовательность содержит
элемент сортировки `ch', то РВ `[[.ch.]]*c' соответствует
первым пяти символам последовательности `chchcc'.
В квадратных скобках элемент сортировки, заключенный в
`[=' и `=]', означает класс эквивалентности, то есть
последовательность символов элемента сортировки,
эквивалентных ему и включающих его самого в эту
последовательность. (Если нет больше эквивалентных
элементов сортировки, то это аналогично выражению,
заключенному в `[.' и `.]'). Например, если o и ^
являются членами эквивалентного класса, то `[[=o=]]',
`[[=^=]]', и `[o^]' являются синонимами. Класс
эквивалентности не(!) может служить границей интервала.
Выражение в квадратных скобках, название класса символов,
заключенное в `[:' и `:]', означает список всех символов,
принадлежащих классу. Существуют стандартные классы
символов:
alnum digit punct
alpha graph space
blank lower upper
cntrl print xdigit
Эти классы определяются в wctype(3). В локали могут быть
определены свои классы. Класс символов не может
использоваться как граница интервала.
Есть два особых случая(!) выражений в квадратных скобках:
выражение `[[:<:]]' и `[[:>:]]' соответствует пустой
строке в начале и конце слова соответственно. Слово
определяется как последовательность символов, входящих в
это слово, и отсутствие символов до и после этой
последовательности. Словесные символы входят в класс
символов alnum (это определяется в wctype(3)), куда входит
еще и подчеркивание. Это совместимое, но не описываемое в
POSIX 1003.2 дополнение, поэтому оно используется в
программах, предназначенных для переноса на другие
платформы (с соответствующим предупреждением).
В случае, если РВ совпадает более чем с одной подстрокой
данной строки, то оно считается совпадающим с первой
подстрокой данной строки. Если РВ совпадает более чем с
одной подстрокой строки, то она совпадет с самой длинной
подстрокой. "Подвыражения" так же соответствуют самой
длинной совпадающей подстроке, полное соответствие должно
быть наиболее длинным, а сами "подвыражения" в РВ для
получения приоритета должны стоять перед остальными.
Высокоуровневые подвыражения имеют приоритет над
низкоуровневыми.
Длина совпадений измеряется в символах, а не в элементах
сортировки. пустая строка считается длиннее несовпадений.
Например, `bb*' совпадает с тремя средними символами
`abbbc', `(wee|week)(knights|nights)' подходит ко всем
десяти символам `weeknights', а когда `(.*).*'
сравнивается с `abc', "подвыражение" в скобках совпадает
со всеми тремя символами; при сравнении `(a*)*' с `bc'
получается, что РВ и "подвыражение" в скобках
соответствуют пустой строке.
Если совпадение указано независимо от его регистра, то
получится, что все совпадения независимо от регистра будут
правильными. Когда буква присутствует в различных
регистрах вне квадратных скобок, то она трансформируется в
выражение в квадратных скобках, содержащее оба регистра,
например, `x' становится `[xX]'. Если буква уже заключена
в скобки, то к ней добавляется и другой регистр, например,
`[x]' становится `[xX]', а `[^x]' превращается в `[^xX]'.
Конкретного ограничения длины РВ не существует. Однако, в
программах, предназначенных для переноса на другую
платформу не следует использовать РВ более 256 байтов.
Абсолютные (``основные'') РВ отличаются друг от друга по
нескольким аспектам. `|', `+', и `?' используются как
обычные символы. Для обозначения границ интервалов
используются `\{' и `\}', а `{' и `}' сами по себе
являются обычными символами. Для обособления
"подвыражений" используются `\(' и `\)', а `(' и `)' сами
по себе являются обычными символами. `^' является обычным
символом за исключением того случая, когда символ стоит в
начале РВ или (!) в начале выражения, в круглых скобках,
`$' является обычным символом, кроме того случая, когда
символ стоит в конце РВ или (!) в конце выражения, в
круглых скобках, символ `*' является обычным, если он
стоит в начале РВ или в начале "подвыражения",
заключенного в круглые скобки (после возможного служебного
символа `^'). И, в дополнение, существует еще один тип
атома: обратная ссылка: `\' с последующей за ней цифрой d,
не равной нулю, и соответствует той самой
последовательности, что и подвыражение d в скобках (число
означает порядковый номер подвыражений, заключенных в
круглые скобки, при считывании его слева направо), таким
образом, например, `\([bc]\)\1' соответствует `bb' или
`cc', но не `bc'.
СМ. ТАКЖЕ
regex(3)
POSIX 1003.2, глава 2.8 (Regular Expression Notation).
НАЙДЕННЫЕ ОШИБКИ
Не рекомендуется использовать два типа РВ.
Имеющаяся в данный момент документация о 1003.2 указывает,
что символ `)' при отсутствии `(' считается обычным; это
опечатка, поэтому данные символы следует читать наоборот.
Обратные ссылки так же не рекомендуется применять, так как
они не имеют подробного определения и в связи с этим
создают путаницу (например,`a\(\(b\)*\2\)*d' соответствует
`abbbd'?).
Определение соответствия разных регистров в 1003.2 тоже
очень туманное. Определение типа ``один регистр замещает
все остальные'', по мнению некоторых специалистов, не
является правильным.
Синтаксические знаки для разделения слов очень неудобны и
не имеют смысла.
АВТОР
Эта страница документа Henry Spencer's regex package.
1994-02-07 REGEX(7)
|