正则校验部分记录(包含强弱密码校验连续数字、字母、关键字、键盘相邻码等)

1、/^[1-9]\d*$/  //正整数 大于0

2、/^(([1-9][0-9]{0,7})\.([0-9]{2}))|[0]\.([0-9]{2})$/   //金额必须保留两位小数,小数点前面控制1-8位

3、/(^[1-9]{1}[0-9]*$)|(^[1-9][0-9]*\.[0-9]{1,2}$)|(^[0]\.[1-9]{1}$)|(^[0]\.[0]{1}[1-9]{1}$)|(^[0]\.[1-9]{1}[0]{1}$)/ //金额可输入大于等于0的金额,小数点后最多输入两位

4、/^0\d{2,3}-\d{7,8}|\d{5,8}|((\+86)|(86))?(13|14|15|16|17|18|19)\d{9}$/  //手机、座机号一起校验例如0755-(号码)、(+86)或者不需要区号   

5、/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X|x)$/ //身份证,不区分大小写x

6、/^[^\s]*$/  //全部不允许空格

7、/^\S+(\s+\S+)*$///首末不允许空格

8、/^[\u4E00-\u9FA5A-Za-z0-9_]+$/ //中英文、数字任何满足一种即可长度大于1即可

9、/^[A-Za-z0-9_]+$/ //英文+数字

10、/^[\u4E00-\u9FA5A-Za-z_]+$/ //中英文

11、/^[a-zA-Z0-9]+\s?[\_\-()a-zA-Z]*[a-zA-Z]+$/  //校验英文名中间的连接符为‘-’、‘_’,连接符不能出现在首尾

12、/^((1[34578]\d{9})(;|;))*?(1[34578]\d{9})(;|;)?$/  //校验可多个手机号或者一个手机号,多个手机号以中英文分号分割,单个手机号结束可出现分号也可不出现分号

13、/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,20}$/ //只能输入大小写字母以及数字,三种类型必须同时存在,长度8-20

14、/^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{8,20}$/ //只能输入大小写字母、特殊字符以及数字,必须存在三种以上,长度8-20

15、强弱密码校验

// 校验强弱密码userName(用户姓名),pass (密码),panent(可去除,我自己项目国际化传输)
export function passwordValid(userName, pass ,parent) {
    var passLower = pass.toLocaleLowerCase();
    let userNameLower = userName.toLocaleLowerCase();
    var flag = ' ' ;
    if (pass == null || pass.length < 8 || pass.length > 20 || pass.length == '') {
        flag = parent.$t('passwordValid.length');
        return flag;
    }
    var isDigit = /^.*[0-9]+.*/;//数字
    var isLowerCase = /^.*[a-z]+.*/; // isLowerCase 小写字母
    var isUpperCase = /^.*[A-Z]+.*/; // isUpperCase 大写字母
    var regEx = /^.*[^a-zA-Z0-9]+.*/;// 特殊字符
    
    // 记录匹配的次数
    var num = 0;
    if (isDigit.test(pass)) {
        num = num + 1;
    }
    if (isLowerCase.test(pass)) {
        num = num + 1;
    }
    if (isUpperCase.test(pass)) {
        num = num + 1;
    }
    if (regEx.test(pass)) {
        num = num + 1;
    }
    if (num <= 2) {
        flag = parent.$t('passwordValid.combination');
        return flag;
    }
    //新密码不能包含用户名(例如原型、倒写、大写、重复)
    if (passLower.indexOf(userNameLower) >= 0) {
        flag = parent.$t('passwordValid.pwdContain');
        return flag;
    }
    let newPass = passLower.split("").reverse().join("");//倒序pass
    if (newPass.indexOf(userNameLower) >= 0){
        flag = parent.$t('passwordValid.pwdContain');
        return flag;
    }
    //密码中不能包含有连续四位及以上顺序(或逆序)数字(如:密码中不能包含1234或3210等)。
    var numberSequence = false;
    for (var i = 0; i < pass.length - 3; i++) {
        if (!isDigit.test(pass.substring(i, i + 1)) 
        || !isDigit.test(pass.substring(i + 1, i + 2) + "") 
        || !isDigit.test(pass.substring(i + 2, i + 3) + "") 
        || !isDigit.test(pass.substring(i + 3, i + 4) + "")) {
            continue;
        }
        var no1 = Number(pass.substring(i, i + 1));
        var no2 = Number(pass.substring(i + 1, i + 2));
        var no3 = Number(pass.substring(i + 2, i + 3));
        var no4 = Number(pass.substring(i + 3, i + 4));
        
        if (no1 + 1 == no2 && no2 + 1 == no3 && no3 + 1 == no4) {
            numberSequence = true;
        }
        if (no2 + 1 == no1 && no3 + 1 == no2 && no4 + 1 == no3) {
            numberSequence = true;
        }
    }
    
    if (numberSequence) {
        flag = parent.$t('passwordValid.numOrder');
        return flag;
    }
    
    //密码中不能包含有连续四位及以上顺序(或逆序)字母,字母不区分大小写(如:密码中不能包含abcd或ABCD或AbcD或DcbA等)。
    var letterSequence = false;
    for (var i = 0; i < passLower.length - 3; i++) {
        if (!isLowerCase.test(passLower.substring(i, i + 1)) || !isLowerCase.test(passLower.substring(i + 1, i + 2) + "") || !isLowerCase.test(passLower.substring(i + 2, i + 3) + "") || !isLowerCase.test(passLower.substring(i + 3, i + 4) + "")) {
            continue;
        }
        var no1 = passLower.charAt(i).charCodeAt() + 0;
        var no2 = passLower.charAt(i + 1).charCodeAt() + 0;
        var no3 = passLower.charAt(i + 2).charCodeAt() + 0;
        var no4 = passLower.charAt(i + 3).charCodeAt() + 0;
        if (no1 + 1 == no2 && no2 + 1 == no3 && no3 + 1 == no4) {
            letterSequence = true;
        }
        if (no2 + 1 == no1 && no3 + 1 == no2 && no4 + 1 == no3) {
            letterSequence = true;
        }
    }
    
    if (letterSequence) {
        flag = parent.$t('passwordValid.wordOrder');
        return flag;
    }
    
    //密码中不能包含有连续四位及以上重复字符,字母不区分大小写(如:密码中不能包含8888、aaaa 或AAAA或BbbB或 $$$$等四位及以上的重复字符)。
    var fourOrMoreSame = false;
    for (var i = 0; i < pass.length - 3; i++) {
        if ((passLower.charAt(i)) == passLower.charAt(i + 1) &&
            passLower.charAt(i + 1) == passLower.charAt(i + 2) &&
            passLower.charAt(i + 2) == passLower.charAt(i + 3)) {
            fourOrMoreSame = true;
        }
    }

    if (fourOrMoreSame) {
        flag = parent.$t('passwordValid.continue');
        return flag;
    }
    // 键盘连续字母判断
    if (isKeyBoardContinuousChar(passLower)){
        flag = parent.$t('passwordValid.keyBoardContinuous');
        return flag;
    }
    var cont = /^.*admin.*$/;
    var cont2 = /^.*pass.*$/;
    //禁忌词不区分大小写不能作为密码的一部分存在于密码中(如:admin, pass)。
    if (cont.test(passLower) || cont2.test(passLower)) {
        flag = parent.$t('passwordValid.keyWord');
        return flag;
    }
    return 'correct';
}



// 键盘相邻字符校验
export function isKeyBoardContinuousChar(str) {
    var c1 = [
        ['!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+'],
        ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '{', '}', '|'],
        ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ':', '"'],
        ['z', 'x', 'c', 'v', 'b', 'n', 'm', '<', '>', '?']
    ];
    var c2 = [
        ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '='],
        ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\\'],
        ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\''],
        ['z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/']
    ];
    str = str.split("");
    //获取坐标位置
    var y = [];
    var x = [];
    for (var c = 0; c < str.length; c++) {
        y[c] = 0; //当做~`键处理
        x[c] = -1;
        for (var i = 0; i < c1.length; i++) {
            for (var j = 0; j < c1[i].length; j++) {
                if (str[c] == c1[i][j]) {
                    y[c] = i;
                    x[c] = j;
                }
            }
        }
        if (x[c] != -1) continue;
        for (var i = 0; i < c2.length; i++) {
            for (var j = 0; j < c2[i].length; j++) {
                if (str[c] == c2[i][j]) {
                    y[c] = i;
                    x[c] = j;
                }
            }
        }
    }
    //匹配坐标连线
    for (var c = 1; c < str.length - 1; c++) {
        if (y[c - 1] == y[c] && y[c] == y[c + 1]) {
            if ((x[c - 1] + 1 == x[c] && x[c] + 1 == x[c + 1]) || (x[c + 1] + 1 == x[c] && x[c] + 1 == x[c - 1])) {
                return true;
            }
        } else if (x[c - 1] == x[c] && x[c] == x[c + 1]) {
            if ((y[c - 1] + 1 == y[c] && y[c] + 1 == y[c + 1]) || (y[c + 1] + 1 == y[c] && y[c] + 1 == y[c - 1])) {
                return true;
            }
        }
    }
    return false;
}

16、随机生成8-20的包含数字、大小写字母、特殊字符的密码

/**
 * 2021年8月20日
 * 生成8-20位随机密码,必包含大写小写数字特殊字符
 * @param length,//生成随机密码长度
 * @param passwordArray,生成密码字符串数组,默认大写,小写,数字,特殊字符
 * @return 返回生成的密码字符串
 */
export function randPassword(length, passwordArray) {
    var min = 8; //最小长度
    var max = 20; //最大长度
    length = Math.floor(Math.random() * (max - min + 1)) + min || 8; //生成随机密码长度
    // 密码串----默认 大写字母 小写字母 数字,特殊字符
    passwordArray = passwordArray || ['ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz', '1234567890', '~!@#$%^&*()_-+=[]{}|\\":;"\'\',./?<>'];
    var password = '';
    // 随机生成开始字符串
    var startIndex = parseInt(Math.random() * (length));
    var randIndex = [];
    for (var i = 0; i < length; i++) {
        // 创建数组,用于取随机位置  [0,1,2,3,4,5,....]
        randIndex.push(i);
    }
    for (var i = 0; i < length; i++) {
        // 根据随机数组生成随机位置
        var r = parseInt(Math.random() * (randIndex.length));
        var num = randIndex[r] + startIndex;
        // 根据随机值取余数
        var randRemainder = num % passwordArray.length;
        // 当前密码串【大写字母,小写字母,数字等】
        var currentPassword = passwordArray[randRemainder];
        // 根据当前密码串长度取随机数
        var index = parseInt(Math.random() * (currentPassword.length));
        // 获取随机字符串
        var str = currentPassword.substr(index, 1);
        // 删除随机数组中已经使用的值
        randIndex.splice(r, 1);
        password += str;
    }
    return password;
}
console.log('生成的密码:', randPassword());

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下语句来实现: ``` SELECT MIN(date), MAX(date) FROM table GROUP BY date - ROW_NUMBER() OVER (ORDER BY date) ``` 其中 `date` 是表中的日期列,你可以指定 `ASC` 或 `DESC` 来决定是按照递增还是递减的顺序进行分组。 例如,如果你希望按照日期的递增顺序分组,可以使用以下语句: ``` SELECT MIN(date), MAX(date) FROM table GROUP BY date - ROW_NUMBER() OVER (ORDER BY date ASC) ``` 如果你希望按照日期的递减顺序分组,可以使用以下语句: ``` SELECT MIN(date), MAX(date) FROM table GROUP BY date - ROW_NUMBER() OVER (ORDER BY date DESC) ``` 这样就可以得到按照连续日期分组的结果了。 ### 回答2: 实现一个可以按照数据递增或递减将连续的日期分组的SQL查询,可以使用窗口函数和日期函数来实现。 假设我们有一个表,包含日期和数据两列。首先,我们可以使用ROW_NUMBER()函数为每一行添加一个序号,根据日期进行排序。然后,我们可以使用日期函数来计算每一行的前一行日期和后一行日期。最后,我们可以通过比较当前行的日期和前一行/后一行日期是否连续,来标记每一行是否属于同一组。 例如,以下是一个示例的SQL查询: ```sql WITH numbered_data AS ( SELECT date, data, ROW_NUMBER() OVER (ORDER BY date) AS row_number, LAG(date) OVER (ORDER BY date) AS previous_date, LEAD(date) OVER (ORDER BY date) AS next_date FROM your_table ) SELECT date, data, CASE WHEN previous_date + INTERVAL '1' DAY = date OR previous_date IS NULL THEN '开始' WHEN next_date - INTERVAL '1' DAY = date OR next_date IS NULL THEN '结束' ELSE '中间' END AS group_flag FROM numbered_data ORDER BY date; ``` 以上查询中,我们首先将原始表通过ROW_NUMBER()函数添加了一个序号,然后使用LAG()和LEAD()函数分别获取了当前行的前一行和后一行日期。然后,我们通过比较当前行日期和前一行/后一行日期是否连续,使用CASE语句来标记每一行是否属于同一组,如果是连续的则为"中间",如果是最早的一行则为"开始",如果是最晚的一行则为"结束"。最后,我们按照日期对结果进行排序。 请注意,以上示例中的"your_table"应替换为你实际使用的表名,另外,你还可以根据实际需求进行更改和优化。 ### 回答3: 要实现按照数据递增或递减将连续的日期进行分组,可以使用SQL中的窗口函数ROW_NUMBER()和LAG()。 首先,我们需要创建一个包含日期的示例表,假设表名为"date_table",包含一个名为"date"的日期列。示例数据如下: ``` date ---------- 2021-01-01 2021-01-02 2021-01-03 2021-01-05 2021-01-06 2021-01-08 2021-01-09 ``` 接下来,我们可以使用ROW_NUMBER()函数为每一行添加一个行号,按照日期进行排序: ```sql SELECT date, ROW_NUMBER() OVER (ORDER BY date) AS row_num FROM date_table ``` 得到的结果如下: ``` date row_num ---------- ------- 2021-01-01 1 2021-01-02 2 2021-01-03 3 2021-01-05 4 2021-01-06 5 2021-01-08 6 2021-01-09 7 ``` 接下来,我们可以使用LAG()函数来计算当前行与上一行日期的差值,根据差值是否为1来判断是否需要进行分组。如果差值不为1,则表示当前行与上一行的日期不连续,需要将当前行作为新的分组的起始行。可以使用如下SQL语句来实现: ```sql SELECT date, CASE WHEN LAG(date) OVER (ORDER BY date) + INTERVAL 1 DAY <> date THEN 1 ELSE 0 END AS group_start FROM date_table ``` 得到的结果如下: ``` date group_start ---------- ----------- 2021-01-01 1 2021-01-02 0 2021-01-03 0 2021-01-05 1 2021-01-06 0 2021-01-08 1 2021-01-09 0 ``` 最后,我们可以再次使用ROW_NUMBER()函数对group_start进行累加计算,得到最终的分组ID。可以使用如下SQL语句来实现: ```sql SELECT date, SUM(group_start) OVER (ORDER BY date) AS group_id FROM ( SELECT date, CASE WHEN LAG(date) OVER (ORDER BY date) + INTERVAL 1 DAY <> date THEN 1 ELSE 0 END AS group_start FROM date_table ) subquery ``` 最终的结果如下: ``` date group_id ---------- ----------- 2021-01-01 1 2021-01-02 1 2021-01-03 1 2021-01-05 2 2021-01-06 2 2021-01-08 3 2021-01-09 3 ``` 以上就是使用SQL实现按照数据递增或递减将连续的日期分组的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值