Here's an explanation of that regex:
^ the start of the string
(?=.{8,}) when looking ahead, there must be at least 8 characters of any type
(?=.*?\d) when looking ahead, there must be at least 1 digit
(?=.*?[a-z]) when looking ahead, there must be at least 1 lower case letter
(?=.*?[A-Z]) when looking ahead, there must be at least 1 upper case letter
(?=.*?[-#!$%_=+<>]) when looking ahead, there must be at least 1 of the following characters: -, #, !, $, %, _, =, +, < or >
.* zero or more characters
$ the end of the string