当前位置: 首页 > 知识库问答 >
问题:

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

逄俊力
2023-03-14

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

条件:

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

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

正则表达式中的正则表达式允许至少一个特殊字符,一个大写字母,一个小写字母(按任何顺序)需要所有三个,并且对长度没有上限,因此看起来我需要修改Tim Pietzcker的解决方案,这是

<代码>^(? =.{ 8,})(? =.*[a-z])(? =. *[A-Z])(? =. *[@#$%^

将匹配包含至少一个小写和一个大写ASCII字符以及集合中至少一个字符的至少8个字符的任何字符串@#$%^


共有2个答案

司空丰
2023-03-14
匿名用户

第一种情况:至少一个字母(大写或小写)和至少一个数字

((?=.*[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]))。(?=.*[0-9]))。{8,32}

(? =. *[A-Z])|(? =.*[a-z]):字母(大写或小写)

(0-9]): 数量

< code>{8,32} 8到32个字符

该部分 : ((|?=.*[a-z]))(?=.*[@#$%^

(? =. *[A-Z])|(? =.*[a-z]):字母(大写或小写)

(?=.*[@#$%^

< code>{8,32} 8到32个字符

零件:(?=.*[0-9])(?=.*[@#$%^

(0-9]): 数量

(?=.*[@#$%^

< code>{8,32} 8到32个字符

这是测试模式的简单代码:

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-相字母和数字

2-相字母和字符

3-具有数字和字符

将验证密码,这对应于上述条件之一:

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");
            }
        }
    }
}

袁良弼
2023-03-14

Regex通常从左到右解析字符串,但这些名为“lookaheads”的(?=xxx)位会导致它验证该部分,而不会将数据包含到匹配的字符串中,也不会推进“光标”。

它使正则表达式看起来很复杂(并且在使用大字符串时可能会导致性能问题),但它确实完成了工作。尽管我同意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}$
 类似资料:
  • 问题内容: 谁能帮助我创建用于密码验证的正则表达式。 条件为“密码必须包含8个字符和至少一个数字,一个字母和一个唯一字符,例如 问题答案:

  • 问题内容: 我正在尝试创建一个正则表达式来根据以下条件验证用户名: 仅包含 字母数字 字符, 下划线 和 点 。 下划线和点号不能位于用户名(例如/ / / )的 末尾 或 开头 。 下划线和点不能 彼此相邻 (例如)。 下划线或点不能被多次使用 的行中 (例如,/ )。 字符数必须在8到20之间。 到目前为止,这是我所做的;听起来它强制执行 除了第5条规则以外的 所有标准规则。我不知道如何添加第

  • 问题内容: 我想要一个只接受数字和点的Java正则表达式。 例如, 点不应位于开始位置或结束位置。 问题答案: 我想这就是你想要的: 说明:接受以点分隔的数字;它以数字开头和结尾;一个数字可以有多个数字;一个不带点的数字也可以接受。 没有多个数字的变体: 需要至少一个点的变体: 不要忘记在Java中必须转义\符号,因此代码如下所示:

  • 本文向大家介绍请用正则表达式验证数字相关面试题,主要包含被问及请用正则表达式验证数字时的应答技巧和注意事项,需要的朋友参考一下 /[0一9]*$/

  • 问题内容: 我正在尝试使用以下规则在Java中使用用户名链: 长度> = 3 有效字符:az,AZ,0-9,点,破折号和下划线。 有人可以帮我提供正则表达式吗? 问题答案: 试试这个正则表达式:

  • 我有一个正则表达式来从完整命令中提取脚本名。它适用于大多数情况,但不适用于示例数据中的第一行。 抽样资料 输出应该是 正则表达式不适用于第一行 https://regex101.com/r/cFjn85/1