【问题标题】:Regex without special characters没有特殊字符的正则表达式
【发布时间】:2021-01-13 05:21:26
【问题描述】:

我正在使用正则表达式来验证密码

这是我的正则表达式配置

@"^(?!.*[\s])(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{6,32}$"

我的标准是

  • 密码必须至少包含一个大写字母、一个小写字母和一个数字;
  • 不能有任何特殊字符、重音或空格;
  • 此外,密码长度可以为 6 到 32 个字符。

我正在等待的测试:

  • BIT123456 无效
  • 2021 年有效
  • Fing!2020 Is Invalid ( but it returns valid )

我检查错误的代码:

using System;
using System.Text.RegularExpressions;

class Program
{

   static void Main(string[] args)
   {

      var totalTestCases = int.Parse(Console.ReadLine());

      string S = "";
      string pattern = @"^(?!.*[\s])(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{6,32}$";

      var n = 0;
      do
      {
         n++;
         S = Console.ReadLine();
         if (S != "")
         {
            // Console.WriteLine("{0}", Regex.IsMatch(S, pattern) ? "Senha valida." : "Senha invalida.");
            string test = Regex.IsMatch(S, pattern) ? "Password valid." : "Password invalid.";
            Console.WriteLine(test);
         }
      } while (n < totalTestCases);
   }
}

【问题讨论】:

  • 除非您正在为现有系统进行开发,否则从安全角度来看,不允许密码中包含特殊字符是不明智的。
  • 这不是为了一个系统,而是为了研究验证如何工作@John

标签: c# regex


【解决方案1】:

尝试将此正则表达式放入您的代码中,它将适用于您的条件。

/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{6,32}$/

用下面的代码替换模式变量:)

string pattern = @"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{6,32}$";

【讨论】:

  • 为什么有效?你改变了什么,你为什么改变它?任何或所有这些事情都会使这成为一个更好的答案
  • 是的,它正在工作,我只是删除特殊字符正则表达式。\ @00110001
【解决方案2】:

@Arpit Patel 的回答非常好,但我会花一点时间来解释你的方法有什么问题。让我们分解一下:

  • ^(?!.*[\s]):否定的前瞻表示“没有空格”。没关系。
  • (?=.*[0-9]):正面展望表示:“必须有一个数字”。没关系。
  • (?=.*[a-z]):正面展望表示:“必须有一个小写字母”。没关系。
  • (?=.*[A-Z]):正面展望表示:“必须有一个大写字母”。没关系。
  • .: 一切顺利!这显然是错误的。
  • {6,32}:长度要求。

所以阿皮特的回答:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{6,32}$

取消“任何事情发生”并插入合法字符。因此,由于禁止使用空格,因此不再需要否定前瞻。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2018-06-13
    • 2023-03-31
    相关资源
    最近更新 更多