Таким образом, используя построитель регулярных выражений (Mx re-builder), для поиска строк, заканчивающихся на \, требуется «\\ $», а при поиске и замене на регулярное выражение - только «\ $». Я ожидал бы, что построитель регулярных выражений создаст непосредственно используемые выражения, так что же объясняет эту разницу?
elisp
regular-expressions
user2699
источник
источник
reb-query-replace
определение функций.Ответы:
На самом деле есть четыре различных
re-builder
варианта синтаксиса, и вы можете переключаться между ними с помощьюC-cTABДва предназначены для компиляторов регулярных выражений sexp-формы
rx
иsregex
(но так как первый более всеобъемлющий и почти полностью совместимый с синтаксисом, вы можете действительно игнорировать sregex, если вы не работаете со старым кодом, который его использовал).Два других варианта синтаксиса
read
(по умолчанию) иstring
(это синтаксис, который вы используете в интерактивном режиме).read
Синтаксис «код» синтаксис - то есть как признание читателя LISP - в котором вы вводите регулярное выражение в соответствии с синтаксисом чтения для строк :C-hig
(elisp) Syntax for Strings
RETstring
Синтаксис (который я всегда считал излишне запутанным имя в данном контексте) является синтаксис регулярных выражений строки , которая уже была считана , и которые , следовательно , не имеет какой - либо из зарезервированных символов требуется при написании строки. То есть, это фактический синтаксис регулярных выражений, такой же, какой вы используете, когда Emacs запрашивает вас в интерактивном режиме.Если вы хотите использовать строковый синтаксис по умолчанию, добавьте следующее в файл инициализации или используйте M-x
customize-option
RETreb-re-syntax
RETОбратите внимание, что вы можете переключаться между чтением и синтаксисом строк при редактировании регулярного выражения без потери данных. Вы также можете переключиться с форм sexp на синтаксис чтения / строки (естественно, для этих библиотек нужна компиляция sexps в строки), но вы не можете пойти в другом направлении и генерировать sexp из строки. re-builder помнит, какой был sexp, так что вы не потеряете эту форму при изменении синтаксиса; но он также не обновляется, если вы измените регулярное выражение в другом синтаксисе, а затем вернетесь обратно. Короче говоря, если вы создаете регулярное выражение как sexp, убедитесь, что вы редактируете его только при использовании этого синтаксиса.
Гвоздь с
rx
поддержкой заключается в том, что он на самом деле используетrx-to-string
функцию, которая не совсем идентична использованиюrx
макроса в коде.rx
принимает произвольное количество аргументов формы и обрабатывает их как подразумеваемую последовательность , тогда какrx-to-string
принимает только одну форму, и любая последовательность верхнего уровня должна быть явной с'(sequence ...)
или эквивалентной.Короче говоря, когда вы вводите форму
'(...)
в перестроителе, она обрабатывается как(rx-to-string '(...))
и не(rx ...)
Также обратите внимание, что неправильная форма может привести
re-builder
к прекращению динамического обновления совпадений в связанном буфере, даже после того, как форма снова станет действительной. C-cC-uСвязывания дляreb-force-update
полезен для разрешения этих ситуаций.По умолчанию строка режима показывает «RE Builder» при использовании
read
илиstring
синтаксис и «RE Builder Lisp» при использованииrx
илиsregex
синтаксис, но кажется гораздо более полезным определить конкретный используемый синтаксис (особенно для различия междуread
иstring
).Если вы устанавливаете
delight
пакет из GNU ELPA, вы можете использовать следующее, чтобы добавить индикатор синтаксиса в строку режима.Это изменяет имя режима на «Regexp [read]» в
read
синтаксисе, а также для остальных.Или включить подсказку для
rx
противrx-to-string
Gotcha описано выше, сделать режим линии скажет «Regexp [ге к строке]» при использованииrx
синтаксиса:источник