#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!!!!
), то это регулярное выражение не является «хорошим».