Есть ли в elisp литералы регулярных выражений?


14

Огромное количество обратных косых черт, которые требуют мои регулярные выражения, довольно безумно. Есть ли в elisp литералы регулярных выражений, поэтому я могу написать что-то вроде

rx"some\(regexp\)"

вместо того

"some\\(regexp\\)"

Emacs выделяет несколько регулярных выражений конструкций , таких как \\|, \\(и \\). К сожалению, во многих темах это не видно. Вы можете переопределить font-lock-regexp-grouping-backslashи font-lock-regexp-grouping-constructсделать это более отчетливым.
Lindydancer

2
Я сделал патч для поддержки необработанных строковых литералов, но разработчикам это не интересно.
Knff

1
Вы всегда можете настроить отображение вещей, как в этом сообщении в блоге @ abo-abo: oremacs.com/2015/01/11/pretty-elisp-regex
glucas

@knarf Жаль, что Стефана не интересовала поддержка необработанных строк, потому что необработанные строки были бы дополнением к новому синтаксису регулярных выражений (который я бы поддержал), а не заменой.
nosefrog

Ответы:


13

Одним из вариантов является использование rxмакроса для построения выражений с использованием sexps.

Ваш пример становится (rx "some" (group "regexp"))

Вот еще пара примеров из раздела комментариев в rx.el, чтобы понять, как это rxработает:

Это ^;;\\s-*\n\\|^\n становится

(rx (or (and line-start ";;" (0+ space) ?\n)
        (and line-start ?\n)))

Это [ \t\n]*:\\([^:]+\\|$\\) становится

(rx (and (zero-or-more (in " \t\n")) ":"
         (submatch (or line-end (one-or-more (not (any ?:)))))))

2
Спасибо за редактирование @knarf! Я разговаривал по телефону и не хотел приводить пример, в котором я могу ошибаться. :-)
glucas

На самом деле мы находимся в процессе перемещения многих сценариев, которые используют большое количество регулярных выражений для поиска и замены, из perl в elisp из-за rxсинтаксиса, что облегчает их сопровождение. Imho, для подобных случаев синтаксис rx сам по себе делает elisp достойной заменой perl python, ruby ​​и т. Д. Спасибо.
gsl

7

Нет, он не имеет литералов регулярных выражений, но многие находят pcre2el полезной альтернативой.

В частности, используя его от elisp, как это:

(rxt-pcre-to-elisp "(abc|def)\\w+\\d+")
   ;; => "\\(\\(?:abc\\|def\\)\\)[_[:alnum:]]+[[:digit:]]+"

Это все еще требует от вас удвоить обратную косую черту. Вам просто не нужно столько же для среднего регулярного выражения.
CJM
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.