35.3.3 Структурированная нотация регулярных выражений 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 или при настройке переменных.


Примечания

(27)

Можно было бы написать гораздо проще с нежадными операторами (как?), но это сделало бы пример менее интересным.