Como escapar caracteres especiais regexp em uma string?

9

Estou compondo uma expressão regular complexa e o usuário pode fornecer uma parte da expressão. No entanto, a parte fornecida pelo usuário deve ser interpretada literalmente, ou seja, caracteres especiais regexp devem ser escapados. Existe uma função para escapar desses caracteres? Parece uma coisa comum de se fazer, mas todo o meu Google não foi bem-sucedido.

Exemplo:

(re-search-forward (format "\b%s\b" user-string))

Se user-stringfor test*case, quero combinar, test*casemas não testttttcase.

Tmalsburg
fonte

Respostas:

12

Você pode usar regexp-quote:

Essa função retorna uma expressão regular cuja única correspondência exata é string. O uso dessa expressão regular na visualização terá sucesso apenas se os próximos caracteres no buffer forem string; usá-lo em uma função de pesquisa será bem-sucedida se o texto que estiver sendo pesquisado contiver sequência.

(regexp-quote "^The cat$") => \\^The cat\\$

Dan
fonte
1
Ótimo, obrigado! Mas por que isso foi tão difícil de encontrar? Às vezes, a documentação do Emacs me deixa louca.
tmalsburg
2
Você pode descrever o que procurou e onde esperava encontrar essa função com o Mx report-emacs-bug. Talvez a documentação esteja faltando e deva ser corrigida.
YoungFrog
2
@tmalsburg Uma palavra-chave útil seria "escape". Talvez (defalias 'regexp-escape 'regexp-quote). Isso foi discutido em alguma das listas de discussão do emacs?
Ebpa 8/03