如何为正则表达式添加多个条件?

时间:2017-11-16 13:32:41

标签: javascript regex

我已经多次尝试但找不到解决方案。

其中一条规则是,如果字符串以数字结尾,那么它必须在字符串中包含一个以上的数字

这些是我的规则 - 正如您在控制台中看到的那样,我的测试无法按预期工作

/* 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'));

2 个答案:

答案 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.)

对于大写几乎相同,真正的要求是具有不是第一个字符的大写。

&#13;
&#13;
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;
&#13;
&#13;

我们还可以添加一些对比度以防止不必要的回溯。作为量词,无论是贪婪还是懒惰,都可以引导回溯,更好的选择是解决角色类。

考虑到第一个预测,我们需要在最后一个字符之前的任何位置匹配一个数字。 (?=.*\d.)然后变为(?=\D*\d.),首先匹配非数字,以防止回溯。

遵循这一原则,整个正则表达式变为:

^(?=\D*\d.)(?=[^a-z]*[a-z])(?=.[^A-Z]*[A-Z])(?=[^-_*&^%$#@!~]*[-_*&^%$#@!~]).{6,80}$

这样,当用户输入一个特别长的字符串时,会很快发生失败(请查看The elements of Regex Style)。

&#13;
&#13;
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;
&#13;
&#13;