The character density is the problem
Regex looks scary because it's information-dense. A pattern like ^(?:[a-zA-Z0-9_'^&/+-])+(?:\.(?:[a-zA-Z0-9_'^&/+-])+)*@(?:(?:\[?(?:[0-9]{1,3}\.){3}[0-9]{1,3}\]?)|(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,})$ has more semantic content per inch than any other syntax in programming. Your eyes refuse to parse it.
That's a real cognitive limit, not a personal failing. Two techniques fix it.
1. Verbose / extended mode
Most engines support a flag that lets you spread the pattern across lines and add comments. In Python it's re.VERBOSE (or re.X). In PCRE it's the x flag.
Suddenly the same pattern reads like normal code. Whitespace inside the pattern is ignored (use \ or [ ] for literal spaces); # starts a comment.
2. Build it in pieces, name the pieces
Even without verbose mode, you can compose patterns from named building blocks. This is how production regex looks in real codebases.
The mindset shift
Regex isn't write-once. It's *read repeatedly*. The version your future self will thank you for is the one with whitespace, comments, and named groups, not the one that fits in 80 columns. Write for the next person — even when the next person is you in two weeks.