似乎我坚持使用简单的正则表达式进行密码检查。
我想要的是什么:
[A-Za-z\d]
[ -/:-@[-`{-~À-ÿ]
(特别列表)我看了一眼here然后我写了类似的东西:
(?=.{8,15}$)(?=.*[A-Za-z\d])(?!([ -\/:-@[-`{-~À-ÿ])\1{4}).*
But it doesn't work, one can put more than 3 of the special chars list
任何提示?
答案 0 :(得分:0)
这会有用吗?
string characters = " -/:-@[-`{-~À-ÿ";
string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
string[] inputs = {
"AABBCCDD",
"aaaaaaaa",
"11111111",
"a1a1a1a1",
"AA@@@@AA",
"A1C EKFE",
"AADE F"
};
foreach (string input in inputs)
{
var counts = input.Cast<char>().Select(x => new { ch = characters.Contains(x.ToString()) ? 1 : 0, letter = letters.Contains(x.ToString()) ? 1 : 0, notmatch = (characters + letters).Contains(x) ? 0 : 1}).ToArray();
Boolean isMatch = (input.Length >= 8) && (input.Length <= 30) && (counts.Sum(x => x.notmatch) == 0) && (counts.Sum(x => x.ch) <= 3);
Console.WriteLine("Input : '{0}', Matches : '{1}'", input, isMatch ? "Match" : "No Match");
}
Console.ReadLine();
答案 1 :(得分:0)
我会使用:(如果你想坚持正则表达式)
var specialChars = @" -\/:-@[-`{-~À-ÿ";
var regularChars = @"A-Za-z\d";
if (Regex.Match(password,$"^(.[{regularChars}{specialChars}]{7,29})$").Success && Regex.Matches(password, $"[{specialChars}]").Count<=3))
{
//Password OK
}
如果包含:
检查长度以及密码是否包含非法字符
检查ony是否包含3次特殊字符
更快的痘痘:
var specialChars = @" -\/:-@[-`{-~À-ÿ";
var regularChars = @"A-Za-z\d";
var minChars = 8;
var maxChars = 30;
if (password.Length >= minChars && password.Length <= maxChars && Regex.Match(password,$"^[{regularChars}{specialChars}]+$").Success && Regex.Matches(password, $"[{specialChars}]").Count<=3))
{
//Password OK
}
答案 2 :(得分:0)
新手在这里..我想我已经设法得到你需要的东西,但你分享的一个测试用例有点奇怪..
A@~` C:
OK -- Match (3 specials, it's okay)
这不应该失败,因为它有超过3个特价吗?
你能尝试一下吗?如果它有效,我会输入正则表达式的解释。
https://regex101.com/r/KCL6R1/2
(?=^[A-Za-z\d -\/:-@[-`{-~À-ÿ]{8,30}$)^(?:[A-Za-z\d]*[ -\/:-@[-`{-~À-ÿ]){0,3}[A-Za-z\d]*$
答案 3 :(得分:0)
将你的正则表达式稍微改组后,它适用于你提供的the examples(我认为你用“A @ ~`C:”这个例子弄错了,它不应该匹配,因为它有6个特殊的字符):
(?!.*(?:[ -\/:-@[-`{-~À-ÿ].*){4})^[A-Za-z\d -\/:-@[-`{-~À-ÿ]{8,30}$
它只需要一个前瞻而不是两个,因为长度和字符集检查可以在没有前瞻的情况下完成:^ [A-Za-z \ d - /: - @ [ - `{ - ~À-ÿ] { 8,30} $
我将负面前瞻改变了一点是正确的。你的错误是只检查连续的特殊字符,你插入通配符.*
的方式使得前瞻不会被击中(因为通配符允许所有内容)。