我搜索了SO和Google,我发现大多数示例似乎都没有按预期工作(或者没有将所有这些元素组合在一起)。我试图创建一个匹配(传递)的Regex表达式,如果一个字符串包含至少字符串中 where 中的一个,如果它丢失则失败其中任何一个:
这是我尝试过的:
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";
}
问题是这不是按预期工作的。以下通过时失败(他们没有特殊字符):
它似乎可以很好地检测除特殊字符之外的所有字符。我做错了什么以及如何解决?
答案 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 包中的扩展。它使这项检查变得如此简单:
using Extensions;
”。"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";
}