Almost all metacharacters (including the dot ., the +, * and ? quantifiers, the end-of-string anchor $, etc.) have no special meaning in character classes, with a few notable exceptions:
- closing bracket
], for obvious reasons
- caret
^, which is used to negate the character class (eg: [^ab] matches any character but a and b).
- hyphen
-, which is used to denote a range (eg: [0-9] matches any digit)
However, these can still be added without escaping if placed in strategic locations within the character class:
- the closing bracket can be placed right after the opening bracket, eg:
[]a] matches ] or a.
- the caret can be placed anywhere but after the opening bracket, eg:
[a^] matches ^ or a
- the hyphen can be placed right after the opening bracket or before the closing bracket, eg:
[-a] and [a-] both match a and -.
More information can be found in the man page on POSIX regex (thanks Tomalak Geret'kal!)