检查字符串是否至少包含以下每个字符串:小写字母,大写字母,数字和特殊字符

时间:2014-04-16 16:13:40

标签: c# asp.net regex

我搜索了SO和Google,我发现大多数示例似乎都没有按预期工作(或者没有将所有这些元素组合在一起)。我试图创建一个匹配(传递)的Regex表达式,如果一个字符串包含至少字符串中 where 中的一个,如果它丢失则失败其中任何一个:

  • 长度至少为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";
}

问题是这不是按预期工作的。以下通过失败(他们没有特殊字符):

  • 123cowboY
  • MonkeyCow123

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

2 个答案:

答案 0 :(得分:12)

使用以下内容更改(?=.*?^[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.

在这个正则表达式中,字符类^内的[]取消了字符。你几乎就在那里,不幸的是你把它放在[]

之外

答案 1 :(得分:1)

虽然有很多方法可以给这只猫剥皮,但我更喜欢将这些代码包装到可重用的扩展方法中,这样以后的工作就变得微不足道了。使用扩展方法时,您还可以避免使用 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";
}