регулярное выражение c # пароль удаление пробелов

#c# #regex

#c# #регулярное выражение

Вопрос:

У меня есть хороший конструктор регулярных выражений, который выглядит следующим образом:

 string numberOfDigits = "2";
string numberOfCaps = "2";
string numberOfChars = "3";
string numberOfNonAlpha = "3";
string minLength = "10";

string rexExString = "^(?=.*\d{"   numberOfDigits   "})(?=.*[A-Z]{"   numberOfCaps   "})(?=.*[a-z]{"   numberOfChars   "})(?=.*[!@#$%^amp;*()]{"   numberOfNonAlpha   "}).{"   minLength   ",}$";
  

затем вывод будет:

 ^(?=.*d{2})(?=.*[A-Z]{2})(?=.*[a-z]{3})(?=.*[!@#$%^amp;*()]{3}).{10,}$
  

Таким образом, я могу указать, сколько цифр, символов, nonalpha и т. Д. Я хочу для своего пароля. Я хочу сохранить это таким образом. Единственная проблема в том, что он также принимает пробелы, и я не хочу этого для своих паролей.

Мой вопрос

Как не допускать пробелов в моем регулярном выражении, но сохранить его в формате, чтобы я мог указать переменные, как в примере выше.

 ^(?=.*d{2})(?=.*[A-Z]{2})(?=.*[a-z]{3})(?=.*[!@#$%^amp;*()]{3}).{10,}$
  

Комментарии:

1. Ваше регулярное выражение заставляет 2 цифры встречаться вместе , аналогично для других проверок — это действительно то, что вы хотите? Большинство политик паролей просто настаивают на количестве символов, а не на том, где они встречаются.

2. Вы не должны использовать d . Вы должны использовать [0-9] . d соответствует неевропейским цифрам msdn.microsoft.com/en-us/library/w1c0s6bb.aspx

Ответ №1:

Проблема не в пробелах в вашем формате, проблема в том, что вы разрешаете ВСЕ символы с вашим .{10,} в конце.

Попробуйте это вместо

 S{10,}
  

S не является пробелом (таким же, как [^s] )

Кстати. вы знаете, что хотите иметь 2 цифры в последовательности с (?=.*d{2}) , а не две цифры в целом? Это означает, что Foo1bar2 не будет принят.

Как насчет упрощения этого?

Поместить все ваши требования в одно регулярное выражение немного сложно. Особенно, если вы хотите разрешить распределение настраиваемого количества цифр между паролем, а не в последовательности.

Почему бы не разделить этот процесс проверки немного.

Вы можете в качестве первого шага просто проверить ^S{10,}$ , чтобы убедиться, что в пароле не менее 10 символов, не содержащих пробелов.

Затем вы можете подсчитать типы символов, например, так:

 MatchCollection uppercase = Regex.Matches(s, @"p{Lu}");
MatchCollection lowercase = Regex.Matches(s, @"p{Ll}");
MatchCollection digits = Regex.Matches(s, @"p{N}");
MatchCollection nonAlpha = Regex.Matches(s, @"[p{N}p{L}]");

Console.WriteLine("Upper: "   uppercase.Count);
Console.WriteLine("Lower: "   lowercase.Count);
Console.WriteLine("Digits: "   digits.Count);
Console.WriteLine("NonAlpha: "   nonAlpha.Count);
  

Просто сопоставьте один символ нужного вам класса, а затем получите количество этих символов, используя count() метод the MatchCollection .

Я использовал свойства Unicode здесь (the p{...} ), вы можете легко изменить это на классы символов, которые вы хотите. Вот обзор свойств Unicode на regular-expressions.info

Затем вы можете получить количество символов каждого типа и сравнить его с требуемым числом для этого конкретного типа.

Это было бы гораздо более читаемой и поддерживаемой функцией.

Комментарии:

1. спасибо, я действительно скопировал и вставил все это вместе, ваш способ справиться с этим идеально подходит для моей ситуации, спасибо.

Ответ №2:

Вместо использования .{10,}$ в конце вы могли бы указать, что должно быть не менее 10 символов, не содержащих пробелов S{10,}$ .

 S{"   minLength   ",}$
  

Обратите внимание на прописную букву S.

Ответ №3:

 Regex rx = new Regex(@"^((?<N>[0-9])|(?<CU>[A-Z])|(?<CL>[a-z])|(?<NA>[!@#$%amp;*()^])| )*$(?<-N>){3}(?<-CU>){1}(?<-CL>){2}(?<-NA>){4}");
  

Это регулярное выражение использует балансирующие группы для «накопления» различных типов символов. Он отклонит символы, которых нет (эти группы плюс пробел). Так, например è , будет отклонено. Если вы хотите изменить его, замените | ) на |.)

В конце строки ( $ ) проверяется, достаточно ли символов во всех различных «стеках». Очевидно, что там, где вы видите {3}, {1}, {2}, {4} , вам нужно будет указать свои цифры.

Обратите внимание, что интересная особенность этого регулярного выражения заключается в том, что оно будет работать для 1!A!a!2!b3 . Если вы хотите, чтобы различные классы символов были смежными (so 123Abc!!!! ), то это регулярное выражение не является «хорошим».