Re: Question about CL-PPCRE
"David McClain (as dbm at refined-audiometrics dot com)" <[email protected]> Wed, 24 Jun 2026 03:53:34 -0700
| Newsgroups | gmane.lisp.lispworks.general |
|---|---|
| Message-ID | <[email protected]> |
Isn’t this just Lisp’s natural semantics in strings? If you want a backslash \ in a string, you need to double them up. CL-PPCRE can only see what remains in a string after Lisp has had its go at it. This is why Emacs and LW regexps are so injurious to vision. I find that CL-PPCRE is generally less noxious because it doesn’t depend on backslash for critical regexp elements. > On Jun 24, 2026, at 03:07, Martin Simmons <[email protected]> wrote: > >>>>>> On Tue, 23 Jun 2026 20:47:32 +0200, Marco Antoniotti (as marco dot antoniotti at unimib dot it) said: >> >> Hi >> >> I am sure I missed something in the CL-PPCRE documentation, but here it is. >> >> I am fooling around with a C tokenizer and I am running into the following >> problem. >> >> The string esre contains the "escape sequences" for C (and Perl, etc etc) >> >> CL Prompt > esre >> "(\\\\(['\\\"\\?\\\\abfnrtv]|[0-7]{1,3}|x[a-fA-F0-9]+))" >> >> If I use CL-PPCRE:REPLACE-ALL I get the following (I tried to boil it down): >> >> CL Prompt > (regex-replace-all "\\$<ES>" "/$<ES>/" esre) >> "/(\\(['\\\"\\?\\abfnrtv]|[0-7]{1,3}|x[a-fA-F0-9]+))/" >> T >> >> Apart from the bounding slashes, I would have expected the result of >> CL-PPCRE:REPLACE-ALL not to return a shorter string. >> >> What exactly (backslash escaping for sure) am I missing? > > It looks like an undocumented feature of the replacement string: \\ is > converted to a single backslash by CL-PPCRE::BUILD-REPLACEMENT-TEMPLATE. That > means it will always return a shorter string when \\ is present in the > replacement string and if you want \\ in the output then you'll need to use > \\\\ (i.e. 8 backslashes in the Lisp syntax of that string!). > > Also, to make it more confusing, if \ is followed by anything other than \ & ` > ' digits or {digits} then it is also treated as a single backslash. i.e. \a > is \a. > > -- > Martin Simmons > LispWorks Ltd > http://www.lispworks.com/ > > _______________________________________________ > Lisp Hug - the mailing list for LispWorks users > [email protected] <mailto:[email protected]> > http://www.lispworks.com/support/lisp-hug.html