Не используйте для этого ни одного регулярного выражения, это будет слишком сложно, так как вам придется выписывать каждую возможную 3-комбинацию из 4 опций и чередовать каждую комбинацию с |
. Разделите каждый тест на одно регулярное выражение, а затем проверьте, сколько тестов пройдено программно:
const test = (str) => {
const hasUpper = /[A-Z]/.test(str);
const hasLower = /[a-z]/.test(str);
const hasNumbers = /\d/.test(str);
const hasSpecial = /[._~!@#$^&*]/.test(str);
if (hasUpper + hasLower + hasNumbers + hasSpecial < 3) {
return false;
}
if (str.toLowerCase().includes('administrator')) {
return false;
}
return str.length >= 8 && str.length <= 30;
};
Если вы также хотите убедиться, что в строке нет символов , отличных от , кроме описанных, затем:
const hasOther = /[^a-z\d._~!@#$^&*]/i.test(str);
if (hasOther) {
return false;
}