Grouping parentheses: 'gr(a|e)y' is equivalent to 'gray|grey'
Quantification how many times the previous element is allowed to repeat. An element is an atomic unit of data that has precise meaning or precise semantics.
? zero or one occurrences: 'colou?r'
* zero of more occurrences: 'ab*c' matches 'ac', 'abc', 'abbc', 'abbbc', etc.
+ one or more occurrences: 'ab+c' matches 'abc', 'abbc', 'abbbc', etc. but not 'ac'
{n} match exactly n times
{min,} match min or more times
{,max} match up to max times
{min,max} match at least min times but not more than max times
[] bracket expression matches a single character contained within the brackets
Wildcard . (single period) matches any character 'a.b' matches any string containing an 'a', then any character, then 'b'
'a.*b' matches any string containing 'a' then 'b' at some later point
That is quite a load to carry, so go slow and test your regex before implementing it in real life.
You can see now why it may be considered it's own language.
Anchors
Not only do we have a lot of control over how we tell a regex what to look for, we can also tell it where to look - either the beginning of the string or the end.
Two symbols you will see a lot of and use:
caret ^ search at the beginning of the string
dollar $ search at the end of the string
[^b]at matches all strings matched by .at except bat
[hc]at$ matches hat and 'cat but only at the end of the line