35.9 Emacs против регулярных выражений POSIX
Синтаксис регулярных выражений значительно различается в компьютерных программах.
При написании кода Elisp, который генерирует регулярные выражения для использования другими
программами, полезно знать, как различаются синтаксические варианты.
Чтобы дать представление об этом различии, в этом разделе обсуждается, чем
регулярные выражения Emacs отличаются от двух синтаксических вариантов, стандартизированных POSIX:
базовые регулярные выражения (BRE) и расширенные регулярные выражения (ERE).
Простая команда grep использует BRE, а grep -E использует ERE.
Регулярные выражения Emacs имеют синтаксис, более близкий к ERE, чем к BRE,
с некоторыми расширениями. Вот краткое изложение того, чем POSIX BRE и ERE
отличаются от регулярных выражений Emacs.
- В POSIX BRE символы + и ? не являются специальными.
Единственные обратные слеш-последовательности экранирования — это \(…\),
\{…\}, \1 по \9, а также
экранированные специальные символы \$, *, ., [,
\\ и \^.
Следовательно, \(?: действует как \([?]:.
POSIX не определяет, как ведут себя другие экранирования BRE;
например, GNU
grep обрабатывает \| так же, как Emacs,
но не поддерживает все экранирования Emacs.
- В POSIX BREs является опцией реализации, является ли ^ специальным
после \(; GNU
grep обрабатывает его так же, как Emacs.
В POSIX ERE ^ всегда специален вне скобочных выражений,
что означает, что ERE x^ никогда не совпадает.
В регулярных выражениях Emacs ^ специален только в
начале регулярного выражения или после \(, \(?:
или \|.
- В POSIX BREs является опцией реализации, является ли $
специальным перед \); GNU
grep обрабатывает его так же, как Emacs. В POSIX ERE $ всегда специален вне скобочных
выражений (см. скобочные выражения), что означает,
что ERE $x никогда не совпадает. В регулярных выражениях Emacs
$ специален только в конце регулярного выражения или
перед \) или \|.
- В POSIX ERE {, ( и | являются специальными,
а ) специален при совпадении с предшествующим (.
Эти специальные символы не используют предшествующие обратные слеши;
(? дает неопределенные результаты.
Единственные обратные слеш-последовательности экранирования — это экранированные специальные символы
\$, \(, \), \*, \+, .,
?, [, \\, \^, \{ и \|.
POSIX не определяет, как ведут себя другие экранирования ERE;
например, GNU grep -E обрабатывает \1 так же, как Emacs,
но не поддерживает все экранирования Emacs.
- В POSIX 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 по умолчанию не обязательно так делает.
См. Поиск с самым длинным совпадением для совпадений регулярных выражений.