Ваше условие чередования неверно.Вместо этого вы можете просто вставить \d
в скобку специальных символов и изменить свое регулярное выражение на следующее:
^(?=.*[\d!@#\$%\^&])(?=.*[a-z])(?=.*[A-Z]).{8,16}$
Теперь ваш взгляд в будущее (?=.*[\d!@#\$%\^&])
ведет себя именно так, как вы хотели.Это гарантирует, что либо один символ будет любой цифрой, либо другие специальные символы, упомянутые в вашем классе символов.
Демо
Причина, по которой вашзаглянуть в будущее (?=.*\d|[!@#\$%\^&])
не удается, потому что ваше первое условие чередования .*\d
, а второе - просто [!@#\$%\^&]
, где, как если бы оно было правильно написано, это должно было быть либо:
(?=.*\d|.*[!@#\$%\^&])
ИЛИ
(?=.*(\d|[!@#\$%\^&]))
И вам действительно не нужно чередование, если вы пишете это так, как я написал выше, где вы можете просто поместить \d
в самом наборе символов, например,
(?=.*([\d!@#\$%\^&]))