Поскольку они не будут отображаться в каком-либо определенном порядке, вам потребуются предварительные утверждения для каждого требуемого класса символов:
(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[~!@#$%\^&*()\-_=+\|\[{\]};:'",<.>/?])
(ПРИМЕЧАНИЕ: обратная косая черта, каретка, дефис и квадратные скобки могут быть специальными внутридиапазона, они должны быть экранированы от обратной косой черты, если они появляются в диапазоне, как показано в четвертом утверждении.)
Эту конструкцию можно сделать значительно более читабельной, используя пробел и комментарии, если ваш вариант регулярного выражения поддерживает *Модификатор 1006 *.В java.util.regex
вы можете сделать:
(?x) # extended syntax
(?=.*[A-Z]) # look ahead for at least one upper case
(?=.*[a-z]) # look ahead for at least one lower case
(?=.*[0-9]) # look ahead for at least one numeral
(?=.*[~!@#$%\^&*()\-_=+\|\[{\]};:'",<.>/?])
# look ahead for at least one of the listed symbols