我不擅长正则表达式。我需要对密码是否正确进行验证。
条件:
您的密码可以是8-32个字符长,并且其中必须包含 至少两个以下字符:
regex to allow atleast one special character, one uppercase, one lowercase(in any order) 中的正则表达式需要全部三个,并且长度没有上限,因此看来我需要将solution修改为Tim Pietzcker ,即
^(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$
将匹配至少包含8个字符的任何字符串,该字符串包含至少一个小写字母和一个大写ASCII字符,以及来自集合
@#$%^&+=
中的至少一个字符(以任何顺序)。
答案 0 :(得分:0)
正则表达式通常从左到右解析字符串-但是,这些称为{lookaheads“的(?=xxx)
位使它可以验证该部分,而无需将数据包括在匹配的字符串中,也不推进” cursor“。
这使正则表达式看起来很复杂(使用大字符串时可能会导致性能问题),但确实可以完成工作。尽管我同意FCin的评论,即您不需要正则表达式,但如果您问我一个很大的好处就是可以将它们存储在设置文件中。
打破例子:
^ Matches the start of the string
(?=.{8,}) Matches when there are at least 8 characters
(?=.*[a-z]) Matches when there is a lowercase letter anywhere
(?=.*[A-Z]) Matches when there is an uppercase letter anywhere
(?=.*[@#$%^&+=]) Matches when there is one of the indicated characters anywhere
.* Matches anything. No lookahead so this advances the "cursor"
$ Matches the end of the string
您只需要组合小写和大写字母:
(?=.*[A-Za-z])
添加与数字匹配的数字:
(?=.*[0-9])
“长度”规则实际上可以在不进行前瞻的情况下完成:
.{8,32}
与“特殊字符”一起,将合并为:
^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[@#$%^&+=]).{8,32}$
答案 1 :(得分:0)
还
第一种情况:至少一个字母(大写或小写)和至少一个数字
((?=.*[A-Z])|(?=.*[a-z]))(?=.*[0-9]).{8,32}
第二种情况:至少一个字母(大写或小写)和至少一个特殊字符
((?=.*[A-Z])|(?=.*[a-z]))(?=.*[@#$%^&+=]).{8,32}
第三种情况:至少一个数字和至少一个特殊字符
(?=.*[0-9])(?=.*[@#$%^&+=]).{8,32}
现在,前面的三个案例已合并,模式将变为:
(((?=.*[A-Z])|(?=.*[a-z]))(?=.*[0-9])).{8,32}|((?=.*[A-Z])|(?=.*[a-z]))(?=.*[@#$%^&+=]).{8,32}|(?=.*[0-9])(?=.*[@#$%^&+=]).{8,32}
说明:
部分: (((?=.*[A-Z])|(?=.*[a-z]))(?=.*[0-9])).{8,32}
(?=.*[A-Z])|(?=.*[a-z])
:字母(大写或小写)
(?=.*[0-9]))
:数字
{8,32}
8至32个字符
部分: ((?=.*[A-Z])|(?=.*[a-z]))(?=.*[@#$%^&+=]).{8,32}
(?=.*[A-Z])|(?=.*[a-z])
:字母(大写或小写)
(?=.*[@#$%^&+=])
:特殊字符
{8,32}
8至32个字符
部分: (?=.*[0-9])(?=.*[@#$%^&+=]).{8,32}
(?=.*[0-9]))
:数字
(?=.*[@#$%^&+=])
:特殊字符
{8,32}
8至32个字符
这是testing模式的简单代码:
using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
// Passwords
String[] passwords = new String[8];
passwords[0] = "ABCabc123"; // letters (uppercase or lowercase) and numbers : VALID
passwords[1] = "*+uu*+aa"; // letters (uppercase or lowercase) and special characters : VALID
passwords[2] = "123+*$0*"; // numbers and special characters : VALID
passwords[3] = "ABCabc123*$#"; // letters (uppercase or lowercase) and numbers and special characters : VALID
passwords[4] = "ABCDabcd"; // letters (uppercase and lowercase) : INVALID
passwords[5] = "abcdefg"; // letters (lowercase) : INVALID
passwords[6] = "ABCDEFGH"; // letters (uppercase) : INVALID
passwords[7] = "123456789"; // numbers : INVALID
// Password validation pattern
var Validation = new Regex(@"((?=.*[A-Z])|(?=.*[a-z]))(?=.*[0-9]).{8,32}|((?=.*[A-Z])|(?=.*[a-z]))(?=.*[@#$%^&+=]).{8,32}|(?=.*[0-9])(?=.*[@#$%^&+=]).{8,32}");
// Validat the passwords
for (int i = 0; i < passwords.Length; i++){
var isValidated = Validation.IsMatch(passwords[i]);
Console.WriteLine(isValidated);
}
}
}
结果:
如果要根据条件分别验证密码,我定义了3种模式,与所需条件兼容:
1- hasLetterAndNumber
2- hasLetterAndCharacter
3- hasNumberAndCharacter
将验证密码,该密码对应于以下条件之一:
using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
// Passwords
String[] passwords = new String[8];
passwords[0] = "ABCabc123"; // letters (uppercase or lowercase) and numbers : VALID
passwords[1] = "*+uu*+aa"; // letters (uppercase or lowercase) and special characters : VALID
passwords[2] = "123+*$0*"; // numbers and special characters : VALID
passwords[3] = "ABCabc123*$#"; // letters (uppercase or lowercase) and numbers and special characters : VALID
passwords[4] = "ABCDabcd"; // letters (uppercase and lowercase) : INVALID
passwords[5] = "abcdefg"; // letters (lowercase) : INVALID
passwords[6] = "ABCDEFGH"; // letters (uppercase) : INVALID
passwords[7] = "123456789"; // numbers : INVALID
// Password validation pattern
var hasLetterAndNumber = new Regex(@"((?=.*[A-Z])|(?=.*[a-z]))(?=.*[0-9]).{8,32}");
var hasLetterAndCharacter = new Regex(@"((?=.*[A-Z])|(?=.*[a-z]))(?=.*[@#$%^&+=]).{8,32}");
var hasNumberAndCharacter = new Regex(@"(?=.*[0-9])(?=.*[@#$%^&+=]).{8,32}");
// Validat the passwords
for (int i = 0; i < passwords.Length; i++){
if((hasLetterAndNumber.IsMatch(passwords[i])) || (hasLetterAndCharacter.IsMatch(passwords[i])) || (hasNumberAndCharacter.IsMatch(passwords[i]))){
Console.WriteLine(passwords[i]);
Console.WriteLine("\n");
}
}
}
}