При использовании регулярного выражения для проверки заданного пароля используются буквенные, цифровые и специальные символы, а не - PullRequest
1 голос
/ 18 октября 2019

Я пытаюсь использовать регулярные выражения в JavaScript, чтобы проверить, имеет ли данный пароль буквенный, цифровой и специальный символ. Однако все, что я пробовал, не работает

Я пытался использовать

/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@"#%$&])[A-Za-z0-9!@"#%$&]{8,30}$/gm

и создавать отдельные переменные регулярного выражения для буквенных, числовых и специальных символов:

let alpha = /^[A-Za-z]+$/i
let numer = /^[0-9]+$/i
let special = /^[!@#$%^&*(),.?;":{}|<>']/i

Изображение моего кода

Когда я записываю в консоль password.match (regex), я всегда вижу ноль

Ответы [ 3 ]

0 голосов
/ 18 октября 2019

Я бы лично выбрал отдельные регулярные выражения, проблема с вашими текущими регулярными выражениями в том, что у вас есть ^ в начале и $ в конце. Это означает, что пароль должен содержать только [A-Za-z] от начала до конца. Затем вы проверяете, содержит ли пароль только [0-9] от начала до конца.

const regexes = {
  alpha:   /[A-Za-z]/,
  number:  /[0-9]/,
  special: /[!@#$%^&*(),.?;":{}|<>']/,
  length:  /^.{8,30}$/
};

["dgXHUYuDdp", "zMv4qQfZj3", "4JXyrsq!J0", "a5Z!"].forEach(password => {
  let valid = Object.values(regexes).every(regex => password.match(regex));

  console.log(
    "password: " + JSON.stringify(password) + "\n" +
    "valid: " + valid
  );
});
0 голосов
/ 18 октября 2019

Хотя я подозреваю, что можно написать регулярное выражение, которое будет выполнять независимое сопоставление позиции / последовательности, у меня болит голова, я просто думаю об этом. Поэтому, даже если бы я мог найти способ сделать это, я бы не реализовал его - код должен быть читаемым и разбираемым людьми. Глядя на то, что вы здесь представили, я думаю, что я гораздо лучше знаком с регулярными выражениями, чем вы, так что даже больше причин не делать этого.

Ваши альфа / числовые / специальные регулярные выражения будут только соответствует строке, содержащей буквы, цифры или специальные символы, а не смесь. Если вы измените их таким образом, то сможете проверить совпадение всех трех (и экранировать метасимволы в специальном регулярном выражении):

let alpha = /[A-Za-z]/i;
let numer = /[0-9]/;
let special = /[!@#$%\^&*(),\.?;":{}|<>\']/;
if (password.match(alpha) && password.match(numer) && password.match(speicial)) {
0 голосов
/ 18 октября 2019

Попробуйте это:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,15}$

Это сообщение давно. Возможно, есть и другие. Простой поиск SO найдет больше примеров. 1

Вот визуализация регулярного выражения:

Regular expression visualization

Демо Debuggex

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...