.net - 具有某些特殊字符的密码的正则表达式,不包括所有其他字符

标签 .net regex

我必须为指定为密码的数据注释正则表达式:

min 8 chars
min 1 upper
min 1 lower
min 1 numeric
min 1 special char which can ONLY be one of the following:$|~=[]'_-+@. (and the password can contain no other special chars besides these)

让我头疼的是特殊字符的排除。

我想出了这个,但它不起作用:

"^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[\d])**(?(?!.*[^$|~=[\]'_\-+@.])|([^\W\w])).*$**

它将我输入的所有内容都解析为无效。

而这(对于特殊字符)本身确实有效:

"(?(?!.*[^$|~=[\]'_\-+@.])|([^\W\w])).*$"

而且我知道第一部分有效,那么我缺少什么才能使它们协同工作?

或者,是否有更简单的方法来实现这一点?

(.NET 环境)

最佳答案

如果你真的想在一个正则表达式模式中做到这一点:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$|~=[\]'_+@.-])[a-zA-Z0-9$|~=[\]'_+@.-]{8,}$

这应该可以解决问题。我们需要前瞻性的小写字母、大写字母、数字和符号。注意,在字符类中,需要将-移动到末尾或者转义。否则它会创建一个你不想要的字符范围。然后我们使用普通匹配来确保只有允许的字符,并且至少有8个。

但是,进行多项测试通常是一种更好的方法。单独运行这些模式:

[a-z]                     // does the input contain a lower case letter?
[A-Z]                     // does the input contain an upper case letter?
\d                        // does the input contain a digit?
[$|~=[\]'_+@.-]           // does the input contain one of the required symbols?
[^a-zA-Z0-9$|~=[\]'_+@.-] // are there invalid characters?

其中前 4 个应返回 true,最后一个应返回 false。此外,您可以检查 input.Length >= 8。这使得代码更具可读性,并允许您发出有关未满足哪个条件的适当错误消息。

事实上,由于最后一个模式确保只有所需的字符,我们可以将“必须有一个符号条件”简化为[^a-zA-Z0-9] (在这两种方法中)。但我不确定这是否会增加或减少可读性。

关于.net - 具有某些特殊字符的密码的正则表达式,不包括所有其他字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16114882/

相关文章:

regex - 如何在 NiFi 中的内容处理器上指定路由的正则表达式?

c# - .NET - 根据使用的构造函数显示/隐藏方法?

regex - R 正则表达式回顾

.net - 如何让 Dotfuscator 从命令行工作?

.net - 根据用户请求访问的组织(每个请求)修改 .NET Core 角色

ruby - 正则表达式去除符号而不是 Ruby 中的外来字符

Javascript正则表达式执行不匹配

c# - 正则表达式匹配由任何字符分组包围的可选组

c# - 解释这个 LINQ 代码?

c# - 我需要处理 SemaphoreSlim 吗