检查字符串是否至少包含以下各项之一:小写字母、大写字母、数字和特殊字符

本文关键字:小写字 大写字母 特殊字符 数字 是否 字符串 包含 检查 | 更新日期: 2023-09-27 17:58:42

我搜索过SO和Google,发现大多数示例似乎都没有按预期工作(或者没有组合所有这些元素)。我正在尝试创建一个Regex表达式,如果字符串中的至少包含以下中的任何一个,则该表达式匹配(通过),如果缺少其中任何一个,则失败:

  • 长度至少为8个字符
  • 大写字符
  • 小写字符
  • 数字
  • 特殊字符(包括句点、下划线等,即白名单方法不可取-允许使用任何非字母数字字符)

这就是我尝试过的:

if (System.Text.RegularExpressions.Regex.IsMatch(txtTest.Text.Trim(), "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?^[a-zA-Z0-9_@.-]).{8,}$"))
{
    lblMsg.Text = "Pass";
}
else
{
    lblMsg.Text = "Fail";
}

问题是,这并没有按预期运行。以下通过而它们应该失败(它们没有特殊字符):

  • 123牛仔
  • MonkeyCow123

它似乎可以很好地检测除特殊字符外的所有字符。我做错了什么?我该怎么解决?

检查字符串是否至少包含以下各项之一:小写字母、大写字母、数字和特殊字符

(?=.*?^[a-zA-Z0-9_@.-])更改为以下内容:

       + see here
(?=.*?[^a-zA-Z0-9_@.-])
                 ^^ i kept the dot, hyphen, etc as you used, if you don't need, remove.

在这个正则表达式中,字符类[]中的^正在否定这些字符。你几乎到了,只是不幸的是,你把它放在了[] 之外

虽然有很多方法可以对这只猫进行剥皮,但我更喜欢将这样的代码封装到可重复使用的扩展方法中,这样做以后就很麻烦了。使用扩展方法时,也可以避免RegEx,因为它比直接的字符检查慢。我喜欢使用Extension.cs NuGet包中的扩展。它使此检查变得简单:

  1. 添加https://www.nuget.org/packages/Extensions.cs包添加到您的项目中
  2. 添加";CCD_ 5";到代码的顶部
  3. "Smith23@".IsStrong()将返回True,而"Smith23".IsStrong()将返回False
  4. 代码其余部分中的每一个其他检查都是简单的MyString.IsStrong()。默认情况下,.IsStrong()验证是否在强字符串中使用了所有4个组件,但如果您只想使用4个组件中的3个,可以像MyString.IsStrong(3)这样做

您的示例代码将变得简单如下:

using Extensions;
//if (System.Text.RegularExpressions.Regex.IsMatch(txtTest.Text.Trim(), "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?^[a-zA-Z0-9_@.-]).{8,}$"))
if (txtTest.Text.Trim().IsStrong())
{
    lblMsg.Text = "Pass";
}
else
{
    lblMsg.Text = "Fail";
}