2016-12-15 7 views
1

Я пытаюсь создать регулярное выражение, которое проверяет пароль пользователя при его создании. Пароль должен быть: длинныеРегулярное выражение в Javascript для проверки пароля

  1. по крайней мере 6 символов и может быть любой тип характера
  2. каждый символ, который используется потребности появляться в пароле ровно 3 раза.

Хорошие примеры:

AAABBB 
ABABBA 
+++=== 
+ar++arra 
myyymm 
/Arrr/AA/ 

Кто-нибудь знает, который регулярное выражение будет выполнить эту задачу?

+0

Amm ... Почему каждый символ должен быть повторен 3 раза? Это делает пароль слабым. 'ab' должен быть преобразован в' aaabbb', и он действителен, но чтобы взломать его, вы занимаете меньше времени ... – Justinas

+1

Я могу дать вам ответ, но сначала объясните, почему вы хотели бы иметь пароли с энтропией в три раза меньше чем необходимо ...? –

+1

Думая об этом немного больше, я не совсем уверен, что это может быть выполнено только с регулярным выражением; определенно не с JavaScript regex с его очень ограниченными возможностями. Вам нужно выполнить два шага: сначала откорректируйте пароль, затем используйте регулярное выражение, чтобы проверить, что каждый символ встречается ровно три раза. –

ответ

2

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

$('button').on('click', function(){ 
 
var s = $('#password').val(); 
 
var split = s.split("").sort().join(""); 
 
if(/^(?:(.)\1{2}(?!\1)){2,}$/.test(split)) 
 
    console.log("Valid password"); 
 
else 
 
    console.log("Invalid password"); 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script> 
 
<input id="password"> 
 
<button>Test me</button>

+0

Это не учитывает общую длину 6 символов, правильно? – laurenmc34

+0

минимум 6 не совсем 6 :) – Fallenhero

+0

@ Томас Айюб спасибо! – laurenmc34

0

Для 1-я варианта, вы должны проверить без регулярных выражений.

var str = "your password"; 
var pattern = /(.)(.*\1){3}/; 
if(str.length >= 6){ 
    // It will give you boolean as return 
    // If it is match then it return true else false 
    pattern.test(str); 
} 
+0

Вы должны попробовать это с некоторыми предоставленными тестовыми выражениями. – pvg

0

Альтернативное решение, так как вы позволяете код (ваш вопрос подразумевает не будет;)

Использование функции как verifyPass ниже следует сделать трюк. Он постепенно заменяет любую действительную комбинацию из трех букв с пустой строкой. Проверяя, что это выполняется более чем в одной итерации (это не менее 6 символов) и заканчивается пустой строкой в ​​конце, это означает, что это действительный пароль.

function verifyPass(pass) { 
 
    var re = /^(.)((?:(?!\1).)*)\1((?:(?!\1).)*)\1((?:(?!\1).)*)$/, 
 
     cnt=0; 
 

 
    while(re.test(pass)) { 
 
    pass = pass.replace(re, '$2$3$4'); 
 
    cnt++; 
 
    } 
 
    return pass==='' && cnt>1; 
 
} 
 

 
var testItems = [ 
 
     '123123123', 
 
     'AAABBB', 
 
     'AAABBBAAA', 
 
     'Qwerty', 
 
     'ABABBA', 
 
     '+++===', 
 
     '111', 
 
     'qweqwd', 
 
     'sdcjhsdfkj', 
 
     '+ar++arra', 
 
     'mYYYmms', 
 
     '/Arrr/AA/' 
 
    ]; 
 
    
 
    testItems.forEach(function(item) { 
 
    document.write('<span style="color:' + (verifyPass(item) ? 'green' : 'red') + ';">' + item + '</span> <br/>'); 
 
    });

Смежные вопросы