There are several other symbols that take on a different meaning inside [ ].
Heh. I was just explaining this to someone on an unrelated forum, so I've got most of it at the front of my head.
Inside grouping brackets, everything means the literal character EXCEPT:
\ always has to be escaped everywhere, no exceptions.
] of course means "end of grouping" so literal ] has to be escaped \]. Technically you can use un-escaped open-bracket [ but if it makes you uneasy you can escape it.
^ at the very beginning means "NOT these characters"; elsewhere means a literal ^ but it doesn't hurt to escape it in case you later rearrange the group.
- between any two characters means the whole character range, like the common [0-9]. It will either yield an error or will simply not work if the characters aren't in order, like [c-a]. In final position the meaning of - depends on dialect, but as with ^ it doesn't hurt to escape it.
Shorthand forms like \d work exactly the same in or out of brackets. So do expressions like \p{Punct} (exact form depends on dialect).
Most RegEx dialects don't mind if you escape things that don't formally need escaping, but only do it when it makes it easier to keep track of the regex. And, of course, when the \ doesn't change the meaning: [w.!?] and [\w.!?] are very different things.
Also be careful about flagging case-insensitivity when you've got brackets, because you may get unintended results. I have come to grief several times over UTF-8 long "s" and even Latin-1 eszet, both of which capitalize to ASCII S.