Portanto, usando o construtor de expressões regulares (Mx re-builder), localizando linhas que terminam em \ takes "\\ $", enquanto na pesquisa e substituição por regex, leva apenas "\ $". Eu esperava que o construtor regex construísse expressões diretamente utilizáveis. Então, o que explica essa diferença?
elisp
regular-expressions
user2699
fonte
fonte
reb-query-replace
definição de função.Respostas:
Na verdade, existem quatro
re-builder
opções de sintaxe diferentes , e você pode alternar entre elas comC-cTABDois são para os compiladores regexp na forma sexp
rx
esregex
(mas como o primeiro é mais abrangente e quase totalmente compatível com a sintaxe, você pode realmente ignorar o sregex, a menos que trabalhe com o código antigo que o usou).As outras duas opções de sintaxe são
read
(o padrão) estring
(que é a sintaxe que você usa interativamente).A
read
sintaxe é a sintaxe 'code' - ou seja, conforme reconhecida pelo lisp reader - na qual você insere o regexp conforme a sintaxe de leitura para strings :C-hig
(elisp) Syntax for Strings
RETA
string
sintaxe (que eu sempre considerei um nome desnecessariamente confuso neste contexto) é a sintaxe de uma sequência de expressões regulares que já foi lida e, portanto, não possui nenhum caractere de escape necessário ao escrever a sequência. Ou seja, esta é a sintaxe da expressão regular real , a mesma que você usa quando o Emacs solicita interativamente.Se você deseja usar a sintaxe de string por padrão, adicione o seguinte ao seu arquivo init ou use M-x
customize-option
RETreb-re-syntax
RETObserve que você pode alternar entre a sintaxe de leitura e de seqüência de caracteres ao editar a regexp, sem perda de dados. Você também pode alternar dos formulários sexp para a sintaxe de leitura / string (naturalmente; compilar sexps para strings é para isso que servem essas bibliotecas), mas não pode ir na outra direção e gerar um sexp a partir de uma string. o re-builder lembra qual era o sexp, para que você não perca essa forma ao alterar a sintaxe; mas também não é atualizado se você modificar o regexp em uma sintaxe diferente e depois voltar. Em suma, se você estiver criando o regexp como um sexp, certifique-se de editá- lo apenas ao usar essa sintaxe.
Uma pegadinha com o
rx
suporte é que ela está realmente usando arx-to-string
função, que não é exatamente idêntica a usar arx
macro no código.rx
aceita um número arbitrário de argumentos de formulário e os trata como uma sequência implícita , enquantorx-to-string
aceita apenas um único formulário, e qualquer sequência de nível superior deve ser explicitada'(sequence ...)
ou equivalente.Em resumo, quando você insere um formulário
'(...)
no reconstrutor, ele é processado como(rx-to-string '(...))
e não(rx ...)
Observe também que um formulário inválido pode
re-builder
interromper a atualização dinâmica das correspondências no buffer associado, mesmo após a validação do formulário. A C-cC-uligação parareb-force-update
é útil para resolver essas situações.Por padrão, a linha de modo mostra "RE Builder" ao usar
read
oustring
sintaxe, e "RE Builder Lisp" ao usarrx
ousregex
sintaxe, mas parece muito mais útil identificar a sintaxe específica em uso (especialmente para diferenciar entreread
estring
).Se você instalar o
delight
pacote do GNU ELPA, poderá usar o seguinte para adicionar um indicador de sintaxe à linha de modo.Isso altera o nome do modo para "Regexp [read]" na
read
sintaxe e da mesma forma para os outros.Ou, para incluir uma dica para a pegada
rx
vsrx-to-string
descrita acima, faça a linha de modo dizer "Regexp [rx-to-string]" ao usar arx
sintaxe:fonte