Spec-Zone.ru › Elisp

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

Синтаксис регулярных выражений значительно различается в разных компьютерных программах. При написании кода Elisp, который генерирует регулярные выражения для использования другими программами, полезно знать, чем отличаются варианты синтаксиса. Чтобы дать представление об этих различиях, в этом разделе рассматривается, чем регулярные выражения Emacs отличаются от двух вариантов синтаксиса, стандартизованных POSIX: базовых регулярных выражений (BRE) и расширенных регулярных выражений (ERE). Обычный grep использует BRE, а ‘grep -E’ — ERE.

Синтаксис регулярных выражений Emacs ближе к ERE, чем к BRE, и содержит некоторые расширения. Ниже приведено краткое описание отличий BRE и ERE POSIX от регулярных выражений Emacs.

  • В BRE POSIX ‘+’ и ‘?’ не являются специальными символами. Единственные escape-последовательности с обратной косой чертой — это ‘\(…\)’, ‘\{…\}’, ‘\1’–‘\9’, а также экранированные специальные символы ‘\$’, ‘\*’, ‘\.’, ‘\[’, ‘\\’ и ‘\^’. Поэтому ‘\(?:’ действует как ‘\([?]:’. POSIX не определяет, как ведут себя другие escape-последовательности BRE; например, GNU grep обрабатывает ‘\|’ так же, как Emacs, но не поддерживает все escape-последовательности Emacs.
  • В BRE POSIX является ли ‘^’ специальным символом после ‘\(’, зависит от реализации; GNU grep обрабатывает его так же, как Emacs. В ERE POSIX ‘^’ всегда является специальным символом вне выражений в квадратных скобках, а значит, ERE ‘x^’ никогда не совпадает. В регулярных выражениях Emacs ‘^’ является специальным символом только в начале регулярного выражения или после ‘\(’, ‘\(?:’ или ‘\|’.
  • В BRE POSIX является ли ‘$’ специальным символом перед ‘\)’, зависит от реализации; GNU grep обрабатывает его так же, как Emacs. В ERE POSIX ‘$’ всегда является специальным символом вне выражений в квадратных скобках (см. выражения в квадратных скобках), а значит, ERE ‘$x’ никогда не совпадает. В регулярных выражениях Emacs ‘$’ является специальным символом только в конце регулярного выражения или перед ‘\)’ или ‘\|’.
  • В ERE POSIX ‘{’, ‘(’ и ‘|’ являются специальными символами, а ‘)’ является специальным символом, если ему соответствует предшествующая ‘(’. Перед этими специальными символами не ставится обратная косая черта; ‘(?’ приводит к неопределённому результату. Единственные escape-последовательности с обратной косой чертой — это экранированные специальные символы ‘\$’, ‘\(’, ‘\)’, ‘\*’, ‘\+’, ‘\.’, ‘\?’, ‘\[’, ‘\\’, ‘\^’, ‘\{’ и ‘\|’. POSIX не определяет, как ведут себя другие escape-последовательности ERE; например, GNU ‘grep -E’ обрабатывает ‘\1’ так же, как Emacs, но не поддерживает все escape-последовательности Emacs.
  • В BRE и ERE повторяющие операторы в начале регулярного выражения или подвыражения (возможно, после ‘^’) приводят к неопределённому результату, за исключением оператора повтора ‘*’, который в BRE ведёт себя так же, как в Emacs. В Emacs эти операторы рассматриваются как обычные символы.
  • В BRE и ERE два идущих подряд оператора повтора приводят к неопределённому результату. В Emacs их поведение определено; например, ‘a**’ эквивалентно ‘a*’.
  • В BRE и ERE пустые регулярные выражения или подвыражения приводят к неопределённому результату. В Emacs их поведение определено; например, ‘\(\)*’ совпадает с пустой строкой,
  • В BRE и ERE использование именованных классов символов ‘[:ascii:]’, ‘[:multibyte:]’, ‘[:nonascii:]’, ‘[:unibyte:]’ и ‘[:word:]’ приводит к неопределённому результату.
  • В BRE и ERE внутри выражений в квадратных скобках могут содержаться элементы упорядочения и выражения классов эквивалентности, например ‘[[.ch.]d[=a=]]’. Регулярные выражения Emacs этого не поддерживают.
  • BRE, ERE и соответствующие им строки не могут содержать ошибки кодирования или байты NUL. В Emacs эти конструкции просто совпадают сами с собой.
  • При поиске с помощью BRE и ERE всегда находится самое длинное совпадение. По умолчанию поиск в Emacs не обязательно делает это. См. Поиск самого длинного совпадения регулярного выражения.

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/POSIX-Regexps.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API