繁体   English   中英

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

[英]Check if string contains at least one of each: lowercase letter, uppercase letter, number, and special character

我已经搜索过 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牛仔
  • 猴牛123

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

使用以下更改(?=.*?^[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,因为它比直接字符检查慢。 我喜欢使用 Extensions.cs NuGet 包中的扩展。 它使这项检查变得如此简单:

  1. https://www.nuget.org/packages/Extensions.cs包添加到您的项目中。
  2. 将“ using Extensions; ”添加到代码的顶部。
  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";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM