当前位置: 首页 > 知识库问答 >
问题:

javascript - js正则问题,我有写对不?

许嘉珍
2023-09-21
大写字母、小写字母、纯数字、特殊符号。四种至少任意三种组合,长度不低于8位。
特殊符号:! @ . - _(以上五种符号都是英文状态下)

以下是我的正则 如果没写对那因该咋写 如果有写对还能优化吗

const re = /^((?=.*[a-z])(?=.*[A-Z])(?=.*[\d!@.\-_])|(?=.*\d)(?=.*[!@.\-_])(?=.*[a-zA-Z]))[\w!@.-]{8,}$/;

共有3个答案

漆雕疏珂
2023-09-21

试一下这个

var regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@.\-_]).{8,}$/; 
漆雕嘉茂
2023-09-21

不是很熟正则,提供另一种解决思路,用于扩展参考

function matchReg (str) {    if (!str || str.length < 8) {        return false;    }    let resMap = {};    str = str.replace(/(([a-z])|([A-Z])|(\d)|([!@\.\-_]))/g, function (str, allMath, matchaz, matchAZ, matchNum, matchSymbol) {        resMap = {            matchaz: !!(resMap.matchaz || matchaz),            matchAZ: !!(resMap.matchAZ|| matchAZ),            matchNum: !!(resMap.matchNum|| matchNum),            matchSymbol: !!(resMap.matchSymbol|| matchSymbol)        }        return '';    });    console.log('匹对情况', resMap);    return Object.values(resMap).filter(Boolean).length >= 3 && str.length === 0;}
牛华皓
2023-09-21

您给出的正则表达式可以满足您的需求,可以匹配四种字符类型中的至少三种,且长度不低于8位。但是,您的正则表达式还可以进行一些优化。

首先,您的正则表达式使用了(?=.*[a-z])(?=.*[A-Z])(?=.*[\d!@.\-_])(?=.*\d)(?=.*[!@.\-_])(?=.*[a-zA-Z])来确保字符串包含至少三种类型的字符。这种写法是正确的,但是可以将两个正则表达式合并为一个。

其次,您在正则表达式中使用了[\w!@.-]{8,}来确保字符串长度不低于8位。这个部分也是正确的,但是\w可以匹配字母、数字和下划线,所以您可以使用\W来匹配除了这三种字符以外的字符。这样可以确保字符串中只包含您所要求的字符类型。

综上所述,您的正则表达式可以优化为以下形式:

const re = /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@.\-_])(?=.*[\W_])[\w!@.\-]{8,}$/;

这个正则表达式仍然满足您的需求,而且更加简洁易读。

 类似资料: