Try it with this password:
It's 8 characters long, it contains a permitted special character, a lower case, and an upper case - but it's not valid.
Don't use a regex for this: Count upper, lower, permitted specials, and others separately, and then check the validity of the password from those counts: Regexes are great at pattern matching, but they don't count well, and you need to count!
The valid numbers are
upper > 0
lower > 0
permitted specials > 0
others = 0
upper + lower + permitted specials >= 8
You can't easily do that with a Regex, and if you do it becomes unmaintainable very, very quickly.