使用顺序字母和数字进行密码验证 - RegEx

时间:2015-09-29 19:34:49

标签: javascript regex password-protection

为了让客户帐户更安全,精心设计的密码是一种很好的做法。这是我的正则表达式字符串,用于密码验证。

/^(?=.*[0-9])(?!.*?\d{3})(?=.*[a-zA-Z])(?!.*?[a-zA-Z]{3})(?=.*[~!@#$%^&*()+-?])([a-zA-Z0-9~!@#$%^&*()+-?]{8,})$/

代表:

  • 8个或更多字符。
  • 大写字母A-Z
  • 小写字母a-z
  • 特殊字符〜!@#$%^& *()+ - ?
  • 此正则表达式功能是什么?:最多不得包含3个连续字母和/或数字。

按顺序排列数字和/或字母不是好的。

示例:

不行= efg123!$,abcd567%,xyz789 ^&,#hijk23456
确定 = ryiiu562 @,erty745#,gjnfl45566 ^

谢谢

2 个答案:

答案 0 :(得分:6)

我无法使用我所知道的RegEx,但这是一种天真的功能方法。

首先,循环遍历字符串,并通过向当前索引添加+1和+2并相应地进行比较,将每个字符与接下来的两个字符进行比较。

其次,再次遍历字符串并比较检查当前字符的后两个字符,看它们是否是连续的。

如果两个循环都找不到连续字符,则该函数返回true,否则返回false。

前四个返回false(失败),而后三个返回true(pass)。

function test(s) {
    // Check for sequential numerical characters
    for(var i in s) 
        if (+s[+i+1] == +s[i]+1 && 
            +s[+i+2] == +s[i]+2) return false;
    // Check for sequential alphabetical characters
    for(var i in s) 
        if (String.fromCharCode(s.charCodeAt(i)+1) == s[+i+1] && 
            String.fromCharCode(s.charCodeAt(i)+2) == s[+i+2]) return false;
    return true;
}

// For demo purposes only
var tests = [
    'efg123!$',
    'abcd567%',
    'xyz789^&',
    '#hijk23456',
    'ryiiu562@',
    'erty745#',
    'gjnfl45566^'
], sep = '\t\u2192 ', out = ['Fail','Pass'], eol = '<br>';
document.write('<pre>');
for(var i in tests) document.write(tests[i] + sep + out[+test(tests[i])] + eol);
document.write('</pre>');

答案 1 :(得分:0)

您可以通过循环使用字符并使用charCodeAt字符串方法,获得与下面类似的功能。

注意:这也适用于以下链接中提出的问题。

string validation for 3 or more consecutive sequential alphanumeric characters in javascript

&#13;
&#13;
function validate() {
  var pwd = document.getElementById('password').value;
  var isValid = checkPassword(pwd);
  var elm = document.getElementById('result');
  elm.innerHTML = isValid ? 'Valid' : 'Invalid';
  elm.style.color = isValid ? 'green' : 'red';
}

function checkPassword(s) {
    
    if(s) {
       var test = (x) => !isNaN(x);
       var check = (x, y, i) => x + i === y;
    
       for(var i = 0; i < s.length - 2; i++) {
         if(test(s[i])) {
            if(test(s[i + 1]) && test(s[i + 2])) {
              if(check(s[i], s[i + 1], 1) &&
                check(s[i], s[i + 2], 2)) {
                return false;
              }
            }
         } else if(!test(s[i + 1]) && !test(s[i + 2])) {
            if(check(s.charCodeAt(i), s.charCodeAt(i + 1), 1) &&
                check(s.charCodeAt(i), s.charCodeAt(i + 2), 2)) {
                return false;
              }
         }
       }
      
    }
    
    return true;
}

document.getElementById('buttonToValidate').click();
&#13;
<input type="text" id="password" value="efg123!$" /> 
<input type="button" id="buttonToValidate" value="Check" onclick="validate()" />
<span id="result" />
&#13;
&#13;
&#13;