If you really want to get technical: ., ?, and + are also shorthands. The formal definition of a regular expression is very minimal on purpose.
`.` is just `(a|b|c|...)` - List of all literal characters
`x?` is just `(x|)` - "x or empty string"
`x+` is just `xx*` - "x followed by zero or more x characters"
Whether this is exactly how they are implemented in any particular regex engine is an implementation detail, but formally there are very few operations which aren't just syntactic sugar.
If you really want to get technical: ., ?, and + are also shorthands. The formal definition of a regular expression is very minimal on purpose.
`.` is just `(a|b|c|...)` - List of all literal characters
`x?` is just `(x|)` - "x or empty string"
`x+` is just `xx*` - "x followed by zero or more x characters"
Whether this is exactly how they are implemented in any particular regex engine is an implementation detail, but formally there are very few operations which aren't just syntactic sugar.