Документация Linux www.linuxdocs.ru

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)

Документация Linux www.linuxdocs.ru
Яндекс - поискЯндекс - поиск