logon password check
加班到现在, 还是得发个 csdn
本文主要通过一个案例介绍两个东西
- 正则表达式中 必须含有某类字符的时候对应的 正则写法(在我之前的正则文章中已经写过了)
- 重复字符以及连续字符的判断方式
正则来表示验证的字符串中必须含有某类字符
重复字符以及连续字符的检测
我们要求 password 中不能含有 类似于: 'abc' 'bca' '111' '222' '333' '123' 'aaa'
这种 重复字符和连续字符。
方案1: 全部正则思想
这是学习正则的一种误区: 正则无敌,处处用正则
使用正则检测重复字符
var str = '111';
var reg = /(\w)\1\1/;
reg.test(str);
使用正则检测连续字符
不会写(理论上通过 /123|234|
应该也能写出来吧)
456.../
方案2: 使用 unicode 的编码
通过字符之间的 编码顺序来判断 是否是连续字符 或者 编码相同来判断是否是重复字符
/**
* 如果是连字符 或者 重复字符返回 false
* 否则返回 true
*/
function judgeChar (str) {
str = str.replace(/s+|s+/g,'');
var _1, _2, _3;
for (var i = 0; i < str.length-2 ; i++) {
_1 = str.charCodeAt(i);
_2 = str.charCodeAt(i+1);
_3 = str.charCodeAt(i+2);
// 判断连续字符: 正序 + 倒序
if ((_1 + 1 === _2 && _2 + 1 ===_3 ) || (_1 - 1 === _2 && _2 - 1 === _3)) {
return false;
}
// 判断重复字符
if (_1 === _2 && _1 === _3 ) {
return false;
}
}
return true;
}
具体的案例实现过程
案例需求
密码检测要求: 包含数字、小写字母、大写字母、特殊字符(_$@),其中至少包含 3 种字符,至少包含8位字符, 不能含有重复字符或者 连续字符(如: 111,aaa,123,abc)
面对案例的分析
首先面对验证的问题,首要想的是 正则表达式, 而真正在进行判断的时候,我们通常会正则表达式配合其他的字符串方法来使用
我一般采取是切分验证,每个小需求分开来验证。
- 找出其中可以使用这个来 验证的
- 不容易使用正则验证的 使用其他方法来实现
- 正则和字符串方法都可以使用的 那就考虑那种好些
分析题目要求:
0.不能含有其他类型字符
1.8 位字符 ,可以使用字符串长度,也可以使用正则
2.重复字符, 连续字符: 使用非正则手段
3.4种字符中选取 至少选取三种字符: 使用正则来实现
正面枚举字符分配的种类【C(3,4)+ C(4,4) = A(3,4)/3! + 1 = 4 * 3 * 2 / (3 * 2 * 1) + 1 = 5 种】
- 大写字母 + 小写字母 + 数字:
(?=.*[A-Z])(?=.*[a-z])(?=.*\d)
- 大写字母 + 小写字母 + 特殊字符:
(?=*[A-z])(?=*[a-z])(?=.*[_$@])
- 大写字母 + 数字 + 特殊字符:
(?=.*[A-Z])(?=.*\d)(?=.*[_$@])
小写字母 + 数字 + 特殊字符:
(?=.*[a-z])(?=.*\d)(?=.*[_$@])
大写字母 + 小写字母 + 数字 + 特殊字符:
(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[_$@])
- 大写字母 + 小写字母 + 数字:
反面 枚举字符分配种类的时候( 10 种)
- 2 个字符: C(2,4) = 4 * 3 /2 = 6
- 1 个字符: C(1,4) = 4
案例代码
function checkPwd (str) {
str = str.replace(/s+|s+/g, '');
var reg2 = /[^A-z\d_$@]/;
if (reg2.test(str)) {
alert('不能含有非法字符!');
return false;
}
// 8 位
if (str.length < 8) {
alert('密码长度小于 8 位');
return false;
}
// 重复连续字符
if (!checkRepeatChar(str)) {
alert('含有重复或者连续字符!');
return false;
}
// 至少 3 种字符
var reg1 = /(?=.*[A-Z])(?=.*[a-z])(?=.*\d)|(?=.*[A-z])(?=.*[a-z])(?=.*[_$@])|(?=.*[A-Z])(?=.*\d)(?=.*[_$@])|(?=.*[a-z])(?=.*\d)(?=.*[_$@])/;
if (!reg.test(str)) {
alert('至少含有三种字符');
return false;
}
return true;
function checkRepeatChar (str) {
var _1, _2, _3;
for (var i = 0; i < str.length-2 ; i++) {
_1 = str.charCodeAt(i);
_2 = str.charCodeAt(i+1);
_3 = str.charCodeAt(i+2);
// 判断连续字符: 正序 + 倒序
if ((_1 + 1 === _2 && _2 + 1 ===_3 ) || (_1 - 1 === _2 && _2 - 1 === _3)) {
return false;
}
// 判断重复字符
if (_1 === _2 && _1 === _3 ) {
return false;
}
}
return true;
}
}
// 测试数据
checkPwd('12323EQEdf$#!@#');// 含有非法字符
checkPwd('qw23Q'); // false 长度不够
checkPwd('123qeR_sdf'); // false 连续字符
checkPwd('qqq12Jla@'); // false 重复
checkPwd('712adFsdf'); // true