Подтвердить что ты не робот

Emacs - регулярные выражения в Lisp должны быть двойными экранами - почему?

Я играл с emacs lisp, и я хотел написать небольшую функцию для поиска и замены регулярных выражений. У меня было чертовски время, чтобы регулярное выражение работало правильно, потому что я не понимал, что все специальные символы должны быть дважды экранированы при написании кода lisp (но не при использовании запроса-замены-regexp в интерактивном режиме!).

Так, например, используя интерактивный запрос query-replace-regexp, вы можете использовать

^\(.*\)[\t]-.*$

но при написании кода elisp вам нужно удвоить escape все так:

^\\(.*\\)[\t]-.*$  

Наконец-то я нашел ссылку на статью в статье Steve Yegge но мне было интересно, знает ли кто-нибудь, почему это?

4b9b3361

Ответ 1

Это потому, что вам нужно избегать обратных косых черт в строках. Если вы не избежите обратной косой черты\(в строке это оказывается просто (

Ответ 2

У вас уже есть ответ, но встроенный помощник для создания регулярных выражений внутри Emacs является повторным застройщиком.

M-x re-builder

Ответ 3

scottfrazier является правильным, один escape анализируется при чтении строки, другой анализируется при создании регулярного выражения. Это довольно легко запомнить, но это может стать болью, особенно когда вы пытаетесь сопоставить буквальную обратную косую черту '\'. Вам нужно сделать это четыре раза "\\\\", потому что вам нужно дважды слэш, чтобы совместить косую черту как в начальном синтаксическом анализе, так и в анализе регулярных выражений.

И когда вы пишете на Qaru об этой проблеме, вы должны использовать 8 слэшей, потому что уценка использует косую черту и для escape-символа.

Ответ 4

FWIW, emacs-lisp-mode будет выделять специальные выражения (например, \\( и \\) для вас. Затем вы можете изменить грани, которые должны быть то, что выделяется.

(Они font-lock-regexp-grouping-construct и font-lock-regexp-grouping-backslash)