RegEx复杂模式

时间:2017-04-03 22:23:38

标签: javascript regex

我必须编写regex来检查string:

  • 长度为5-15个字符
  • 至少有2个大写字母
  • 至少有2个小写字母
  • 并且有1位数字

我感谢任何帮助,因为我真的很困惑,并且没有任何想法如何解决这个问题。

3 个答案:

答案 0 :(得分:5)

您可以使用预先检查所有条件,然后匹配5到15个字符(任意),确保没有其他内容(^$):

^(?=(?:.*[A-Z]){2})(?=(?:.*[a-z]){2})(?=.*\d).{5,15}$

  • ^:字符串的开头
  • (?= ):积极向前看。不抓取任何字符,但只是向前看,看模式是否匹配
  • (?: ):使此群组无法捕获,即您不会将其作为捕获群体,您可以使用$1\1(取决于语言)
  • .*[A-Z]:0个或多个字符后跟大写字母
  • .*[a-z]:0个或多个字符后跟小写字母
  • .*\d:0个或多个字符后跟数字
  • {2}:之前的模式必须匹配两次
  • .{5-15}:5到15个字符。
  • $:字符串结尾

在JavaScript中,您可以使用test针对正则表达式测试字符串,例如:



var regex = /^(?=(?:.*[A-Z]){2})(?=(?:.*[a-z]){2})(?=.*\d).{5,15}$/;

console.log(regex.test('a9B1c')); // false, missing capital letter
console.log(regex.test('a9B1cD')); // true




答案 1 :(得分:0)

trinctot是正确的,但取决于谁在使用您的代码以及为什么,这可能更容易维护/修改:

var lowerPass = 2 <= (string.match(/[a-z]/g) || []).length;
var upperPass = 2 <= (string.match(/[A-Z]/g) || []).length;
var digitPass = 1 <= (string.match(/[0-9]/g) || []).length;
var lengthPass = 5 <= string.length <= 15;

var stringPass = lowerPass + upperPass + digitPass + lengthPass == 4;

答案 2 :(得分:0)

尝试一下

    ^([a-z]{2,}[A-Z]{2, }[0-9]{1}+) {5, 15}$