Subject: Re: bug#12665: regexp fault for closing square bracket within character class
From: Mark H Weaver <[email-masked]>
To: Panicz Maciej Godek <[email-masked]>
Cc: [email-masked]
Date: Thu, 18 Oct 2012 00:54:01 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

Panicz Maciej Godek <[email-masked]> writes:
> guile 2.0.5-deb+1-1
> (string-match "[\\[]" "[")
> ===> #("[" (0 . 1))
> (string-match "[\\]]" "]")
> ===> #f

As documented in "Syntax of Regular Expressions" of the Emacs manual
(to which section 6.15 of the Guile manual refers):

     To include a `]' in a character set, you must make it the first
     character.  For example, `[]a]' matches `]' or `a'.  To include a
     `-', write `-' as the first or last character of the set, or put
     it after a range.  Thus, `[]-]' matches both `]' and `-'.

For example:

  (string-match "[]\\]" "]")   ==>  #("]" (0 . 1))

Note that backslash is also a member of this character class, and of the
character class in your first example:

  (string-match "[]\\]" "\\")  ==>  #("\\" (0 . 1))
  (string-match "[\\[]" "\\")  ==>  #("\\" (0 . 1))

You might have been thinking that the backslash would escape the square
brackets in your class, but that's not how it works within character
classes.  '[' can be included anywhere in a character class without
being escaped, and ']' and '-' are handled as described above.

    Regards,
      Mark