#c# #regex
#c# #регулярное выражение
Вопрос:
Для проверки одной буквенно-цифровой строки мы обычно используем регулярное выражение "^[a-zA-Z0-9_]*$"
(или наиболее предпочтительно "^w $"
для C #). Но это регулярное выражение принимает только числовые строки или строки только алфавита, такие как "12345678"
или "asdfgth"
.
Мне нужно одно регулярное выражение, которое будет принимать только буквенно-цифровые строки, в которых есть по крайней мере один алфавит и одно число. То есть регулярным выражением "ar56ji"
будет одна из правильных строк, а не ранее упомянутые строки.
Заранее спасибо.
Комментарии:
1. Вы пытаетесь применить какие-то правила ввода паролей? Если это так, пожалуйста, подумайте о том, чтобы вообще этого не делать.
2. Нет, это не для любого совпадения паролей. Мне это нужно для строкового поля, которое будет однозначно идентифицировать объект во всем приложении. Поскольку это задано пользователем so, по требованию клиента я подумал, что регулярное выражение было бы хорошим вариантом для этого.
Ответ №1:
Это должно сделать это:
if (Regex.IsMatch(subjectString, @"
# Match string having one letter and one digit (min).
A # Anchor to start of string.
(?=[^0-9]*[0-9]) # at least one number and
(?=[^A-Za-z]*[A-Za-z]) # at least one letter.
w # Match string of alphanums.
Z # Anchor to end of string.
",
RegexOptions.IgnorePatternWhitespace)) {
// Successful match
} else {
// Match attempt failed
}
РЕДАКТИРОВАТЬ 2012-08-28 Повышена эффективность поиска за счет замены ленивых точечных звездочек на конкретные классы жадных символов.
Комментарии:
1. ОЧЕНЬ полезно и поучительно 1. Спасибо за публикацию.
2. Очень хорошее регулярное выражение для моих целей. Я использовал кое-какую модифицированную версию:
"^(?=.*?[0-9])(?=.*?[A-Za-z])[a-zA-Z0-9_] $"
. На самом деле я воспринимаю это как простую строку, поэтому там написано, W как ‘Недопустимая Escape-последовательность’. Спасибо.3. ridgerunner: Хорошо. Это работает нормально. Как наложить ограничение длины в этом регулярном выражении? Предположим, что длина строки должна составлять ровно 8 символов.
4. Понял.
^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]{8}$
это позволит проверить наличие по крайней мере одного числа, по крайней мере одного алфавита с заглавными буквами и по крайней мере одного алфавита со строчными буквами. а также проверяет длину.
Ответ №2:
Попробуйте это:
"^w*(?=w*d)(?=w*[a-zA-z])w*$"
Об этом есть хорошая статья здесь:
http://nilangshah.wordpress.com/2007/06/26/password-validation-via-regular-expression /
Комментарии:
1. Это регулярное выражение также работает. Но я думаю, что нет необходимости добавлять
W*
в начало и конец регулярного выражения. ОдногоW*
должно быть достаточно в начале или в конце. Спасибо.
Ответ №3:
Это должно сработать:
"^[a-zA-Z0-9_]*([a-zA-Z][0-9]|[0-9][a-zA-Z])[a-zA-Z0-9_]*$"
Это будет соответствовать:
<zero-or-more-stuff>
EITHER <letter-followed-by-digit> OR <digit-followed-by-letter>
<zero-or-more-stuff>
Обеспечивая наличие либо цифры, за которой следует буква, либо буквы, за которой следует цифра, вы выполняете требование иметь по крайней мере одну цифру и по крайней мере одну букву. Обратите внимание, что я опустил _
приведенное выше, потому что было неясно, примете ли вы это как букву, цифру или ни то, ни другое.
Комментарии:
1. строка pwd = «a1111111»; // Должна проходить, но этого не происходит.
Ответ №4:
Попробуйте это ^([a-zA-z] [0-9][a-zA-Z0-9]*)|([0-9] [a-zA-z][a-zA-Z0-9]*)$
Ответ №5:
Чем проще, тем лучше. Если вам было трудно написать это изначально, вам (или какому-то другому плохому специалисту) будет трудно поддерживать его или изменять. (И я думаю, что я вижу некоторые возможные пробелы в подходах, перечисленных выше.)
using System.Text.RegularExpressions;
boolean IsGoodPassword(string pwd){
int minPwdLen = 8;
int maxPwdLen = 12;
boolean allowableChars = false;
boolean oneLetterOneNumber = false;
boolean goodLength = false;
string allowedCharsPattern = "^[a-z0-9]*$";
//Does it pass the test for containing only allowed chars?
allowableChars = Regex.IsMatch(pwd, allowedCharsPattern , RegexOptions.IgnoreCase));
//Does it contain at least one # and one letter?
oneLetterOneNumber = Regex.IsMatch(pwd, "[0-9]")) amp;amp; Regex.IsMatch(pwd, "[a-z]", RegularExpressions.IgnoreCase));
//Does it pass length requirements?
goodLength = pwd.Length >= minPwdLength amp;amp; pwd.Length <= maxPwdLength;
return allowableChars amp;amp; oneLetterOneNumber amp;amp; goodLength;
}
Комментарии:
1. Я не собираюсь использовать это для подбора какого-либо хорошего пароля. Ваш подход хорош, но для обратного вызова сервера потребуется много времени, а затем в браузере появится ошибка. Итак, полезно использовать регулярное выражение и присоединять его к самому элементу управления на странице silverlight. Это будет намного быстрее, поскольку оно будет проверяться на стороне клиента. В любом случае, какие пробелы вы видели в приведенных выше регулярных выражениях? ridgerunner дал хорошее выражение. Спасибо.