rxВ качестве альтернативы синтаксису на основе строк Emacs предоставляет структурированную нотацию rx, основанную на S-выражениях Lisp. Эта нотация обычно легче читается, пишется и поддерживается, чем строки регулярных выражений, и может свободно форматироваться и комментироваться. Она требует преобразования в строковый формат, поскольку именно его ожидают функции регулярных выражений, но это преобразование обычно происходит во время компиляции байт-кода, а не во время выполнения кода Lisp, использующего регулярное выражение.
Вот регулярное выражение rx, соответствующее блочному комментарию в языке программирования C:27:
(rx "/*" ; Начальный /*
(zero-or-more
(or (not "*") ; либо не *,
(seq "*" ; либо * с последующим
(not "/")))) ; не /
(one-or-more "*") ; По крайней мере одна звездочка,
"/") ; и финальный /
Или, используя более короткие синонимы и записав более компактно,
(rx "/*"
(* (| (not "*")
(: "*" (not "/"))))
(+ "*") "/")
В традиционном строковом синтаксисе это было бы записано как:
"/\\*\\(?:[^*]\\|\\*[^/]\\)*\\*+/"
Нотация rx в основном полезна в коде Lisp; ее нельзя использовать в большинстве интерактивных ситуаций, где запрашивается регулярное выражение, например, при выполнении query-replace-regexp или при настройке переменных.
Можно было бы написать гораздо проще с нежадными операторами (как?), но это сделало бы пример менее интересным.