在 C# 中具有流畅验证的正则表达式 - 如何在密码中不允许空格和某些特殊字符?

Posted

技术标签:

【中文标题】在 C# 中具有流畅验证的正则表达式 - 如何在密码中不允许空格和某些特殊字符?【英文标题】:RegEx with fluent validation in C# - how to not allow spaces and certain special characters in a password? 【发布时间】:2020-10-05 09:21:30 【问题描述】:

到目前为止,这是我的 C# 应用程序中对密码的流畅验证

RuleFor(request => request.Password)
    .NotEmpty()
    .MinimumLength(8)
    .Matches("[A-Z]+").WithMessage("'PropertyName' must contain one or more capital letters.")
    .Matches("[a-z]+").WithMessage("'PropertyName' must contain one or more lowercase letters.")
    .Matches(@"(\d)+").WithMessage("'PropertyName' must contain one or more digits.")
    .Matches(@"[""!@$%^&*():;<>,.?/+\-_=|'[\]~\\]").WithMessage("' PropertyName' must contain one or more special characters.")
    .Matches("(?!.*[£# “”])").WithMessage("'PropertyName' must not contain the following characters £ # “” or spaces.")
    .Must(pass => !blacklistedWords.Any(word => pass.IndexOf(word, StringComparison.OrdinalIgnoreCase) >= 0))
        .WithMessage("'PropertyName' contains a word that is not allowed.");

以下部分目前不起作用

.Matches("(?!.*[£# “”])").WithMessage("'PropertyName' must not contain the following characters £ # “” or spaces.")

例如,当密码为“Hello12!#”时,不会返回验证错误。 £ # “” 和空格不应出现在密码中,如果其中任何一个存在,验证将失败,并且“PropertyName”不得包含以下字符 £ # “”或空格。错误信息。

如何修改它以使其正常工作?

【问题讨论】:

为什么要这样限制密码? 这部分(?!.*[£# “”]) 表示不应该出现列出的字符,但\W 确实匹配所有这些字符 试过.Matches(@"[""!@$%^&amp;*():;&lt;&gt;,.?/+\-_=|'[\]~\\]")了吗? @WiktorStribiżew 是的,该部分有效,谢谢,更新了问题,因为我不太清楚我在问什么,目前不起作用的部分是不允许空格和 £ # 和“ “ 人物。如果其中任何一个在密码中,它应该返回验证错误,但它没有。请问有什么想法吗? 试过.Matches("^[^£# “”]*$")? 【参考方案1】:

你可以使用

RuleFor(request => request.Password)
    .NotEmpty()
    .MinimumLength(8)
    .Matches("[A-Z]").WithMessage("'PropertyName' must contain one or more capital letters.")
    .Matches("[a-z]").WithMessage("'PropertyName' must contain one or more lowercase letters.")
    .Matches(@"\d").WithMessage("'PropertyName' must contain one or more digits.")
    .Matches(@"[][""!@$%^&*():;<>,.?/+_=|'~\\-]").WithMessage("' PropertyName' must contain one or more special characters.")
    .Matches("^[^£# “”]*$").WithMessage("'PropertyName' must not contain the following characters £ # “” or spaces.")
    .Must(pass => !blacklistedWords.Any(word => pass.IndexOf(word, StringComparison.OrdinalIgnoreCase) >= 0))
        .WithMessage("'PropertyName' contains a word that is not allowed.");

注意:

.Matches(@"[][""!@$%^&amp;*():;&lt;&gt;,.?/+_=|'~\\-]") - 这匹配字符串中任意位置的 ASCII 标点符号,如果不匹配,则会弹出错误并显示相应的消息 .Matches("^[^£# “”]*$") - 这匹配整个字符串,其中每个字符不能是 £#、空格、。如果任何字符等于这些字符中的至少一个,则会弹出错误消息。

关于[][""!@$%^&amp;*():;&lt;&gt;,.?/+_=|'~\\-]] 是字符类中的第一个字符,不必转义。 - 放在字符类的末尾,也不必转义。

【讨论】:

以上是关于在 C# 中具有流畅验证的正则表达式 - 如何在密码中不允许空格和某些特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 和 Javascript 中验证 FQDN 的正则表达式

C# 中用于电子邮件验证的最佳正则表达式

C#中如何限制textbox只能输入英文和数字

C#中如何限制textbox只能输入英文和数字

正则表达式 c# 表达式验证除零以外的所有数字

匹配 XML 字符串的正则表达式在 C# 中具有开始和结束标记