正则校验密码问题?

正则校验密码问题
实现包含3位及以上的数字字母密码,不允许为连续/重复的数字或字母,包括正序和倒序,例如:Abc.123、Aaaa@123、Zyx@321

使用正则校验密码正则好像不能校验,用程序写没啥思路

阅读 1.9k
avatarAI BotBETA

正则表达式确实可以用于密码校验,但要实现包含3位及以上的数字字母密码,同时不允许连续/重复的数字或字母(包括正序和倒序)的功能,正则表达式可能会变得相当复杂,并且不一定能够完全满足所有要求。

下面是一个尝试满足这些要求的正则表达式示例:

^(?![a-zA-Z]+$)(?![0-9]+$)(?!(.)\1{2})(?!(.)(?!\1)(.)\3{2})[a-zA-Z0-9]{3,}$

这个正则表达式的含义如下:

  • ^ 表示字符串的开始
  • (?![a-zA-Z]+$) 确保密码不是全字母
  • (?![0-9]+$) 确保密码不是全数字
  • (?!(.)\1{2}) 确保没有连续三个相同的字符
  • (?!(.)(?!\1)(.)\3{2}) 确保没有正序或倒序的三个相同字符(例如 123321
  • [a-zA-Z0-9]{3,} 确保密码至少包含3个字母或数字
  • $ 表示字符串的结束

请注意,这个正则表达式并不完美,它可能无法处理所有可能的边缘情况。例如,它可能无法处理包含特殊字符的密码,或者处理包含多个连续/重复字符的复杂情况。

在实际应用中,更好的做法可能是使用正则表达式进行基本的格式校验,然后使用编程语言中的逻辑代码来检查密码是否满足其他要求。这样可以更容易地处理更复杂的规则和边缘情况。

如果你希望使用正则表达式和编程语言结合的方式来实现密码校验,我可以为你提供更详细的代码示例。

4 个回答
function checkPassword(password) {
    
    const isDigitOrLetter = (char) => {
        return /[a-zA-Z0-9]/.test(char);
    }

    // 检查密码中是否包含至少3位数字或字母
    let digitOrLetterCount = 0;
    for (let i = 0; i < password.length; i++) {
        if (isDigitOrLetter(password[i])) {
            digitOrLetterCount++;
        }
    }

    if (digitOrLetterCount < 3) {
        return false;
    }

    // 检查密码中是否包含连续或重复的数字或字母(包括正序和倒序)
    for (let i = 0; i < password.length - 2; i++) {
        if (isDigitOrLetter(password[i]) && isDigitOrLetter(password[i + 1]) && isDigitOrLetter(password[i + 2])) {
            let charCode1 = password.charCodeAt(i);
            let charCode2 = password.charCodeAt(i + 1);
            let charCode3 = password.charCodeAt(i + 2);

            // 检查是否连续
            if (charCode2 === charCode1 + 1 && charCode3 === charCode1 + 2) {
                return false;
            }

            if (charCode2 === charCode1 - 1 && charCode3 === charCode1 - 2) {
                return false;
            }

            // 检查是否重复
            if (password[i] === password[i + 1] && password[i] === password[i + 2]) {
                return false;
            }
        }
    }

    return true;
}

密码是否一定包含数字、字母或特殊字符中的几种,字符是否重复,以及密码长度可以用正则
可以参考:https://regex.top/password 并加以修改
是否包含连续可以用循环查询

"0123456789".indexof(str.substr(i,3))
"abcd..."...
function isValidPassword(password) {
 // Check for at least 3 characters
 if (password.length < 3) return false;

 // Regex to check for consecutive characters
 const consecutiveRegex = /([a-zA-Z0-9])\1+/;
 // Regex to check for reverse sequences
 const reverseRegex = /([a-zA-Z0-9])\1+/;

 // Check for consecutive characters
 if (consecutiveRegex.test(password)) return false;

 // Check for reverse sequences by reversing the string and checking again
 if (reverseRegex.test(password.split('').reverse().join(''))) return false;

 return true;
}

// Test cases
console.log(isValidPassword("Abc.123")); // true
console.log(isValidPassword("Aaaa@123")); // false, consecutive 'a'
console.log(isValidPassword("Zyx@321")); // false, reverse sequence '123'

这种就别用正则了, 老老实实用程序判断吧.

推荐问题
宣传栏