在 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(@"[""!@$%^&*():;<>,.?/+\-_=|'[\]~\\]")
了吗?
@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(@"[][""!@$%^&*():;<>,.?/+_=|'~\\-]")
- 这匹配字符串中任意位置的 ASCII 标点符号,如果不匹配,则会弹出错误并显示相应的消息
.Matches("^[^£# “”]*$")
- 这匹配整个字符串,其中每个字符不能是 £
、#
、空格、“
或 ”
。如果任何字符等于这些字符中的至少一个,则会弹出错误消息。
关于[][""!@$%^&*():;<>,.?/+_=|'~\\-]
,]
是字符类中的第一个字符,不必转义。 -
放在字符类的末尾,也不必转义。
【讨论】:
以上是关于在 C# 中具有流畅验证的正则表达式 - 如何在密码中不允许空格和某些特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章