要求类型4选3
(匹配时再加上前一种输入判断)
核心思路:判断当前输入的后面是不是符合要求
microsoft 的描述
(?!pattern)执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?!95|98|NT|2000)' 匹配“Windows 3.1”中的 “Windows”,但不匹配“Windows 2000”中的“Windows”。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后
另一种解释 转自 https://www.oschina.net/question/12_9507
(?<=exp) 也叫零宽度正回顾后 发断言,它断言自身出现的位置的前面能匹配表达式 exp。比如 (?<=\bre)\w+\b 会匹配以 re 开头的单词的后半部 分 (除了 re 以外的部分),例如在查找 reading a book 时,它匹配 ading。假如你想要给一个很长的数字中每三位间加一个逗号 (当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})+\b,用它对 1234567890 进 行查找时结果是 234567890。
实操 正向否定 穷举
let _arr = ['\\d', 'a-z', 'A-Z', '~!@#$%\\^&\\*\\(\\)\\[\\]\\{\\}\\?\\+'];
this.a(_arr, 2, 6, 20);
4个参数
密码中包含的类型
2个类型进行一个组合
密码最小长度
密码最大长度
a(_arr, m = 2, min = 6, max = 20) {
let temp = this.bbb(_arr, m);
// 拼接字符串
let k = [];
for (let val of temp) {
k.push(`(?![${val.join('')}]+$)`);
}
k.push(`[${_arr.join('')}]{${min},${max}}$`);
console.log(k);
// 生成正则
console.log(new RegExp('^' + k.join('')));
return new RegExp('^' + k.join(''));
},
k的打印结果
文章图片
拼接完转成正则
/^(?![\da-z]+$)(?![\dA-Z]+$)(?![\d~!@#$%\^&\*\(\)\[\]\{\}\?\+]+$)(?![a-zA-Z]+$)(?![a-z~!@#$%\^&\*\(\)\[\]\{\}\?\+]+$)(?![A-Z~!@#$%\^&\*\(\)\[\]\{\}\?\+]+$)[\da-zA-Z~!@#$%\^&\*\(\)\[\]\{\}\?\+]{6,20}$/
bbb(arr, m) {
// 顺序组合
let r = [];
_([], arr, m);
return r;
function _(t, a, m) {
//t:临时数组 a:目标数组 m:多少个数进行组合
if (m === 0) {
r[r.length] = t;
//相当于push
return;
}
for (let i = 0;
i <= a.length - m;
i++) {
//从0开始 到n-mlet b = t.slice();
//将t赋值给b 不能用=赋值,使用slice会形成新的数组赋值
b.push(a[i])
_(b, a.slice(i + 1), m - 1);
}
}
},
ddd(arr, size, result) {
// this.ddd(_arr, m, []);
// 全序组合
{
if (result.length == size) {
// console.log('result', result);
this.temp.push(result)
} else {
for (var i = 0, len = arr.length;
i < len;
i++) {
var newArr = [].concat(arr);
var curItem = newArr.splice(i, 1);
this.ddd(newArr, size, [].concat(result, curItem));
}
}
}
},
【密码校验4选3 生成对应正则】参考文章:
理论解释部分 https://blog.csdn.net/web13985085406/article/details/123227552
bbb方法 引用 https://blog.csdn.net/gty931008/article/details/104469015
ddd方法 引用 https://www.jianshu.com/p/23fe4d5c8f51
推荐阅读
- log4j|nignx配置文件种的跳转
- Python每日一练|Python每日一练(牛客新题库)——第27天(正则表达式练习)
- vim实用技巧|Vim实用技巧_7.模式匹配和查找
- Linux|Linux awk命令详解
- C入门|指针与字符串,读取字符串,字符串库函数举例 C语言入门
- kubernetes|你不是不会处理多行日志,只是不会写正则表达式而已~
- #|【LeetCode】10、正则表达式匹配
- 网络编程|走进boost
- C++|走进Boost