in reply to Regex Search String in a Variable

Hi

> I feel like I am missing something very basic here, but I just can't see it. TIA for any suggestions.

You are getting bitten by what is called "slasheritis" in the emacs-lisp world.

You have to escape backslashes from two interpretations which turns many elisp regexes into an unreadable mess filled with quadruple backslashes \\\\

This works:

#!/usr/bin/perl use strict; use warnings; use Test::More; my ($text, $search); $text = "\\x1\\x2\\x3\\x4"; $text =~ s/x2\\.+\\x4/new/; my $exp = $text; $text = "\\x1\\x2\\x3\\x4"; $search = "x2\\\\.+\\\\x4"; $text =~ s/$search/new/; my $got = $text; is( $got, $exp, "slasheritis"); done_testing;

ok 1 - slasheritis 1..1

there are more elegant solutions in Perl°, but I wanted to clarify the problem.

HTH! :)

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery

°) alas not in GnuEmacs. XEmacs had "raw strings", but became abandon-ware.

Replies are listed 'Best First'.
Re^2: Regex Search String in a Variable
by johnaj (Sexton) on May 01, 2021 at 20:31 UTC
    °) alas not in GnuEmacs. XEmacs had "raw strings", but became abandon-ware.

    While it does not provide raw strings, I've always found the rx macro to offer a very neat solution for building complicated regular expressions, somewhat akin to Perl's /x flag:

    (rx "\\x2" (one-or-more nonl) "\\x4")
      that's true, but you still need two \\ to quote a meta.

      here a bad but not exceptional line taken from cperl-mode

      "\\((\\(\\\\.\\|[^\\\\()]\\|([^\\\\()]*)\\)*)\\)?"

      edit

      and more things need escaping in elisp regexes

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery

Re^2: Regex Search String in a Variable
by roho (Bishop) on May 01, 2021 at 21:01 UTC
    Thanks LanX. You're right. Once I doubled the "double" backslashes it worked fine.

    "It's not how hard you work, it's how much you get done."