Square brackets: pick one from this list
[abc] matches exactly one character that is either a, b, or c. Not the whole substring abc — one character that's one of those three.
This is the workhorse of regex. "A vowel": [aeiou]. "A digit or a letter": [a-zA-Z0-9]. "A separator": [ ,;\t]. Once you start thinking in character classes, half the patterns you write fall out naturally.
Inside a class, special characters mostly aren't special
One of the most useful regex facts: most metacharacters lose their special meaning inside [...]. The dot . inside a class is literal. So is +, ?, (, ), {, }. Inside a class you barely need to escape anything.
The exceptions — characters that ARE still special inside a class:
]— closes the class. Escape it (\]) or place it first ([]abc]).\— still the escape character.^— special if it's the first character (negation, next lesson). Literal anywhere else.-— special between two characters (forms a range). Literal if first, last, or escaped.
Order doesn't matter, duplicates are harmless
[cba] is identical to [abc]. [aabbcc] is identical to [abc]. The class is a set — engine deduplicates internally.