Регулярное выражение, совпадающее как минимум с n группами - PullRequest
6 голосов
/ 19 июля 2011

Я собирался написать регулярное выражение, которое будет соответствовать, только если строка содержит хотя бы n различных классов символов.Я собирался использовать это, чтобы заставить своих пользователей создавать надежные пароли, и хотел проверить, содержит ли пароль хотя бы 3 из следующих элементов:

  • Символы
  • Прописные символы
  • Числа
  • Специальные символы

Написание регулярного выражения, которое соответствует, если присутствуют все эти классы, тривиально, используя lookaheads.Тем не менее, я не могу обернуть голову вокруг "по крайней мере 3" части.Возможно ли это (в хорошем, компактном выражении) или мне нужно создать выражение монстра?

Ответы [ 3 ]

6 голосов
/ 19 июля 2011

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

(?!([a-zA-Z]*|[a-z\d]*|[^A-Z\d]*|[A-Z\d]*|[^a-z\d]*|[^a-zA-Z]*)$).*

В порядке, группы здесь:

  • нижний и / или верхний
  • нижний и / или цифры
  • нижний и / или специальный
  • верхние и / или цифры
  • верхние и / или специальные
  • цифры и / или специальные

Это регулярное выражение не будет выполнено, если вся строка(из-за $ в отрицательном прогнозе) содержит только символы из любой из вышеуказанных групп.

2 голосов
/ 19 июля 2011

Вы должны написать выражение для каждой возможной комбинации 3 из 4 (всего четыре выражения), а затем |отдельные выражения вместе, так что они проходят, если они выполняют хотя бы одно из исходных выражений.

0 голосов
/ 19 июля 2011

Что вы думаете об этом решении?

var str='23khkS_s';

var countGroups=0;
if(str.match(/[a-z]+/))
    countGroups++;
if(str.match(/[A-Z]+/))
    countGroups++;
if(str.match(/[0-9]+/))
    countGroups++;
if(str.match(/[-_!@#$%*\(\)]+/))
    countGroups++;

console.log(countGroups);

Вместо использования 1 монстроподобного выражения вы можете использовать 4 маленьких RE. А затем работайте с переменной countGroups, которая содержит количество созданных групп символов. Я надеюсь, что это полезно

...