关于正则表达式:密码校验4选3-生成对应正则

2次阅读

共计 1851 个字符,预计需要花费 5 分钟才能阅读完成。

要求类型 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 -m

            let 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));
            }
        }
    }
},

参考文章:
实践解释局部 https://blog.csdn.net/web13985085406/article/details/123227552
bbb 办法 援用 https://blog.csdn.net/gty931008/article/details/104469015
ddd 办法 援用 https://www.jianshu.com/p/23fe4d5c8f51

正文完
 0