Reputation: 21171
I've been playing around with emacs lisp, and I wanted to write a little function to do a regular expression search and replace. I had a heck of a time getting the regular expression to work correctly because I didn't realize that all the special characters need to be double escaped when writing lisp code (but not when using query-replace-regexp interactively!).
So for example, using query-replace-regexp interactively you can use
^\(.*\)[\t]-.*$
but when writing elisp code you need to double escape everything like so:
^\\(.*\\)[\t]-.*$
I finally found a reference to this in a Steve Yegge article, but I was wondering if anyone knew why this is?
Upvotes: 27
Views: 5680
Reputation: 17327
It's because you need to escape backslashes in strings. If you don't escape the backslash of \(
in the string, it turns out to be just (
Upvotes: 24
Reputation: 42674
FWIW, emacs-lisp-mode
will fontify the special expressions (like
\\(
and \\)
for you. You can then change the faces to be
something that stands out.
(They are font-lock-regexp-grouping-construct
and font-lock-regexp-grouping-backslash
)
Upvotes: 8
Reputation: 74430
You already have the answer, but a built-in aide for creating regular expressions inside Emacs is re-builder.
M-x re-builder
Upvotes: 19
Reputation: 79103
scottfrazier is correct, one escape is parsed when the string is read, another is parsed when creating the regular expression. It's fairly easy to remember, but it can become a pain, especially when you're trying to match a literal backslash '\'. You end up having to do it four times '\\\\' because you have to double-slash to match the slash in both the initial string parse and the regular expression parse.
And when you write on Stack Overflow about this problem you have to use 8 slashes because markdown uses the slash for an escape character as well.
Upvotes: 10