检查字符串是否至少包含以下各项之一:小写字母、大写字母、数字和特殊字符
本文关键字:小写字 大写字母 特殊字符 数字 是否 字符串 包含 检查 | 更新日期: 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包中的扩展。它使此检查变得简单:
- 添加https://www.nuget.org/packages/Extensions.cs包添加到您的项目中
- 添加";CCD_ 5";到代码的顶部
"Smith23@".IsStrong()
将返回True,而"Smith23".IsStrong()
将返回False- 代码其余部分中的每一个其他检查都是简单的
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";
}