Source: https://www.cs.rit.edu/~jmg/courses/cs380/20061/slides/3-1-regexp.pdf