正则表达式:任何字母,数字和0最多3个特殊字符

时间:2017-06-02 08:41:08

标签: regex

似乎我坚持使用简单的正则表达式进行密码检查。

我想要的是什么:

  • 8个最多30个符号(总计)
  • 使用以下任何一项:[A-Za-z\d]
  • 0最多3 这些:[ -/:-@[-`{-~À-ÿ](特别列表)

我看了一眼here然后我写了类似的东西:

(?=.{8,15}$)(?=.*[A-Za-z\d])(?!([ -\/:-@[-`{-~À-ÿ])\1{4}).*

But it doesn't work, one can put more than 3 of the special chars list

任何提示?

4 个答案:

答案 0 :(得分:0)

这会有用吗?

            string characters = " -/:-@[-`{-~À-ÿ";
            string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
            string[] inputs = {
                "AABBCCDD",
                "aaaaaaaa",
                "11111111",
                "a1a1a1a1",
                "AA@@@@AA",
                "A1C EKFE",
                "AADE   F"
                              };

            foreach (string input in inputs)
            {
                var counts = input.Cast<char>().Select(x => new { ch = characters.Contains(x.ToString()) ? 1 : 0, letter = letters.Contains(x.ToString()) ? 1 : 0, notmatch = (characters + letters).Contains(x) ? 0 : 1}).ToArray();
                Boolean isMatch = (input.Length >= 8) && (input.Length <= 30) && (counts.Sum(x => x.notmatch) == 0) && (counts.Sum(x => x.ch) <= 3);

                Console.WriteLine("Input : '{0}', Matches : '{1}'", input, isMatch ? "Match" : "No Match");
            }
            Console.ReadLine();

答案 1 :(得分:0)

我会使用:(如果你想坚持正则表达式)

var specialChars = @" -\/:-@[-`{-~À-ÿ";
var regularChars = @"A-Za-z\d";
if (Regex.Match(password,$"^(.[{regularChars}{specialChars}]{7,29})$").Success && Regex.Matches(password, $"[{specialChars}]").Count<=3))
{
  //Password OK
}

如果包含:

  1. 检查长度以及密码是否包含非法字符

  2. 检查ony是否包含3次特殊字符

  3. 更快的痘痘:

    var specialChars = @" -\/:-@[-`{-~À-ÿ";
    var regularChars = @"A-Za-z\d";
    var minChars = 8;
    var maxChars = 30;
    if (password.Length >= minChars && password.Length <= maxChars && Regex.Match(password,$"^[{regularChars}{specialChars}]+$").Success && Regex.Matches(password, $"[{specialChars}]").Count<=3))
    {
       //Password OK
    }
    

答案 2 :(得分:0)

新手在这里..我想我已经设法得到你需要的东西,但你分享的一个测试用例有点奇怪..

    A@~`  C:
    OK -- Match (3 specials, it's okay)

这不应该失败,因为它有超过3个特价吗?

你能尝试一下吗?如果它有效,我会输入正则表达式的解释。

https://regex101.com/r/KCL6R1/2

    (?=^[A-Za-z\d -\/:-@[-`{-~À-ÿ]{8,30}$)^(?:[A-Za-z\d]*[ -\/:-@[-`{-~À-ÿ]){0,3}[A-Za-z\d]*$

答案 3 :(得分:0)

将你的正则表达式稍微改组后,它适用于你提供的the examples(我认为你用“A @ ~`C:”这个例子弄错了,它不应该匹配,因为它有6个特殊的字符):

(?!.*(?:[ -\/:-@[-`{-~À-ÿ].*){4})^[A-Za-z\d -\/:-@[-`{-~À-ÿ]{8,30}$

它只需要一个前瞻而不是两个,因为长度和字符集检查可以在没有前瞻的情况下完成:^ [A-Za-z \ d - /: - @ [ - `{ - ~À-ÿ] { 8,30} $

我将负面前瞻改变了一点是正确的。你的错误是只检查连续的特殊字符,你插入通配符.*的方式使得前瞻不会被击中(因为通配符允许所有内容)。