Документация по LinuxLinuxDoc.Ru 🔍

regex - регулярные выражения стандарта POSIX 1003.2

НАЗВАНИЕ
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'.

НАЙДЕННЫЕ ОШИБКИ
Не рекомендуется использовать два типа РВ.

Имеющаяся в данный момент документация о 1003.2 указывает,
что символ `)' при отсутствии `(' считается обычным; это
опечатка, поэтому данные символы следует читать наоборот.

Обратные ссылки так же не рекомендуется применять, так как
они не имеют подробного определения и в связи с этим
создают путаницу (например,`a\(\(b\)*\2\)*d' соответствует
`abbbd'?).

Определение соответствия разных регистров в 1003.2 тоже
очень туманное. Определение типа ``один регистр замещает
все остальные'', по мнению некоторых специалистов, не
является правильным.

Синтаксические знаки для разделения слов очень неудобны и
не имеют смысла.

АВТОР
Эта страница документа Henry Spencer's regex package.
Читать новости Linux в Telegram
Linux - regex - регулярные выражения стандарта POSIX 1003.2
Мы в соцсетях ✉