Единственное, что я полагаю, «не работает», что, если честно, немного расплывчато, так это то, что оно МОЖЕТ начинаться с цифры. Кроме того, он работает так, как вы описали.
Исправьте это так:
/^(?=.*\d)(?=.*[!@&.$#])\D.{6,15}$/
Краткое объяснение (если вы сами не написали регулярное выражение):
^ # match the beginning of the input
(?= # start positive look ahead
.* # match any character except line breaks and repeat it zero or more times
\d # match a digit: [0-9]
) # end positive look ahead
(?= # start positive look ahead
.* # match any character except line breaks and repeat it zero or more times
[!@&.$#] # match any character from the set {'!', '#', '$', '&', '.', '@'}
) # end positive look ahead
\D # match a non-digit: [^0-9]
.{6,15} # match any character except line breaks and repeat it between 6 and 15 times
$ # match the end of the input