C#中用于字段验证的正则表达式

时间:2018-10-22 10:18:11

标签: c# regex

我不擅长正则表达式。我需要对密码是否正确进行验证。

条件:

您的密码可以是8-32个字符长,并且其中必须包含 至少两个以下字符:

  1. 至少一个字母(大写或小写)
  2. 至少一个数字
  3. 至少一个特殊字符

regex to allow atleast one special character, one uppercase, one lowercase(in any order) 中的正则表达式需要全部三个,并且长度没有上限,因此看来我需要将solution修改为Tim Pietzcker ,即

  

^(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$

     

将匹配至少包含8个字符的任何字符串,该字符串包含至少一个小写字母和一个大写ASCII字符,以及来自集合@#$%^&+=中的至少一个字符(以任何顺序)。

2 个答案:

答案 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}

结果: enter image description here

第二种情况:至少一个字母(大写或小写)至少一个特殊字符

((?=.*[A-Z])|(?=.*[a-z]))(?=.*[@#$%^&+=]).{8,32}

enter image description here

第三种情况:至少一个数字至少一个特殊字符

(?=.*[0-9])(?=.*[@#$%^&+=]).{8,32}

enter image description here

现在,前面的三个案例已合并,模式将变为:

(((?=.*[A-Z])|(?=.*[a-z]))(?=.*[0-9])).{8,32}|((?=.*[A-Z])|(?=.*[a-z]))(?=.*[@#$%^&+=]).{8,32}|(?=.*[0-9])(?=.*[@#$%^&+=]).{8,32}

这是您想要的结果: enter image description here


说明:

部分: (((?=.*[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);
        }
    }
}

结果:

enter image description here

如果要根据条件分别验证密码,我定义了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");
            }
        }
    }
}

enter image description here