Вы можете использовать положительное утверждение нулевой ширины для решения этой проблемы.Вот регулярное выражение, и я разберу его ниже.
/(?=.*[A-Za-z0-9])[A-Za-z0-9, .!@#$%^&*()_]{3,25}/
Первый компонент - (?=.*[A-Za-z0-9])
.Конструкция (?=...)
является утверждением нулевой ширины, что означает, что она что-то проверяет, но не «съедает» ничего из вывода.Если часть «...» совпадает, утверждение проходит, а регулярное выражение продолжается.Если оно не совпадает, утверждение не выполняется, и регулярное выражение возвращается как не соответствующее.В этом случае наше «...» есть «. * [A-Za-z0-9]», которое просто говорит «проверьте, чтобы видеть, что там есть буквенно-цифровой символ где-то , мы неcare where ".
Следующий компонент - [A-Za-z0-9, .!@#$%^&*()_]{3,25}
, и он просто говорит, что соответствует от 3 до 25 символов из любых допустимых.Мы уже знаем, что по крайней мере один из них является буквенно-цифровым из-за нашего положительного утверждения, так что это достаточно хорошо.