我已经多次尝试但找不到解决方案。
其中一条规则是,如果字符串以数字结尾,那么它必须在字符串中包含一个以上的数字
这些是我的规则 - 正如您在控制台中看到的那样,我的测试无法按预期工作
/* password length 6-80, */
/* if ends with digit then must contain two digit, */
/* 1 upper case character, 1 lowercase character, 1 digit and 1 special character. */
/* If password starts with uppercase character then 2 uppercase character are required. */
var re = /(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[-_*&^%$#@!~])((?=\b[A-Z]).*[A-Z].*[A-Z].*|(?!\b[A-Z]))((?=.*\d$).*\d.*\d.*|(?!.*\d$)){6,80}/g;
console.log("false?",re.test('Aa@sasA1'));
console.log("true?",re.test('Aa@sa1sA1'));
答案 0 :(得分:2)
var re = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[-_*&^%$#@!~])(?=[A-Z].*[A-Z]|[^A-Z])(?=.*\d.*\d$|.*\D$).{6,80}$/;
console.log("false?",re.test('Aa@sasA1'));
console.log("true?",re.test('Aa@sa1sA1'));

<强>解释强>
(?=[A-Z].*[A-Z]|[^A-Z]) : first character: 1 upper and another one OR not upper
(?=.*\d.*\d$|.*\D$) : last character: digit and another one before OR not a digit
答案 1 :(得分:1)
这些要求看起来很奇怪。请阅读Microsoft Password Guidance。
必须包含一个数字+必须包含一个数字,当last是数字时,该数字不是最后一个数字=必须包含前一个数字之前的一个数字。换句话说:将(?=.*\d)
替换为(?=.*\d.)
。
对于大写几乎相同,真正的要求是具有不是第一个字符的大写。
var re = /^(?=.*\d.)(?=.*[a-z])(?=.+[A-Z])(?=.*[-_*&^%$#@!~]).{6,80}$/;
console.log("false?",re.test('Aa@sasA1'));
console.log("false?",re.test('Aa@sasa1'));
console.log("true?",re.test('Aa@sa1sA1'));
&#13;
我们还可以添加一些对比度以防止不必要的回溯。作为量词,无论是贪婪还是懒惰,都可以引导回溯,更好的选择是解决角色类。
考虑到第一个预测,我们需要在最后一个字符之前的任何位置匹配一个数字。 (?=.*\d.)
然后变为(?=\D*\d.)
,首先匹配非数字,以防止回溯。
遵循这一原则,整个正则表达式变为:
^(?=\D*\d.)(?=[^a-z]*[a-z])(?=.[^A-Z]*[A-Z])(?=[^-_*&^%$#@!~]*[-_*&^%$#@!~]).{6,80}$
这样,当用户输入一个特别长的字符串时,会很快发生失败(请查看The elements of Regex Style)。
var re = /^(?=\D*\d.)(?=[^a-z]*[a-z])(?=.[^A-Z]*[A-Z])(?=[^-_*&^%$#@!~]*[-_*&^%$#@!~]).{6,80}$/;
console.log("false?",re.test('Aa@sasA1'));
console.log("false?",re.test('Aa@sasa1'));
console.log("true?",re.test('Aa@sa1sA1'));
&#13;