Чи є у elisp буквами regexp?


14

Велика кількість нахилів, які потрібні мої повторні виразки, є досить божевільною. Чи є в elisp буквали regexp, тож я можу написати щось подібне

rx"some\(regexp\)"

замість

"some\\(regexp\\)"

Emacs виділяє кілька регулярних виразів конструкцій , таких як \\|, \\(і \\). На жаль, у багатьох темах це не видно. Ви можете перекрити font-lock-regexp-grouping-backslashі font-lock-regexp-grouping-constructзробити це більш виразним.
Lindydancer

2
Я зробив виправлення для підтримки необроблених рядкових літералів, але розробники не зацікавлені.
knarf

1
Ви завжди можете налаштувати, як відображаються речі, як у цій публікації в блозі від @ abo-abo: oremacs.com/2015/01/11/pretty-elisp-regex
glucas

@knarf прикро, що Стефан не зацікавився підтримкою необроблених рядків, тому що необроблені рядки були б доповненням до нового синтаксису regexp (що я б на користь), а не заміною.
ніс-жаба

Відповіді:


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синтаксис, що полегшує їхнє обслуговування. Імхо, для подібних випадків синтаксис rx сам по собі робить elisp гідною заміною perl python, ruby ​​тощо. Дякую.
gsl

7

Ні, у ній немає регекс- літералів, але багато хто вважає pcre2el корисною альтернативою.

Конкретно використовуючи його від elisp, як це:

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

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