Используйте Lookaheads:
/^(?=.*[a-zA-Z])[\w#*,$.&%!><^@-]*$/
Редактировать:
Я предполагаю, что -
означает фактический -
символ, а не диапазон от space
до !
.
Я убрал символ пробела. Вы, конечно, можете добавить его, если хотите.
[ -!]
Эффективно означает:
[ -!] # Match a single character in the range between “ ” and “!”
И я понятия не имею, что влечет за собой этот диапазон!