Регулярное выражение для приема буквенно-цифровых символов (6-10 символов) .NET, C#

Я создаю форму регистрации пользователя, используя С# с .NET. У меня есть требование проверить введенные пользователем поля пароля. Требование проверки приведено ниже.

  1. Он должен быть буквенно-цифровым (a-z, A-Z, 0-9)
  2. Он должен принимать 6-10 символов (минимум 6 символов, максимум 10 символов)
  3. По крайней мере, с 1 буквой и цифрой (пример: stack1over)

Я использую регулярное выражение, как показано ниже.

^([a-zA-Z0-9]{6,10})$

Он удовлетворяет моим первым 2 условиям. Это не удается, когда я ввожу только символы или цифры.


person Madhu    schedule 03.02.2010    source источник
comment
Почему, почему, почему вы устанавливаете максимально допустимую длину пароля?   -  person Damien_The_Unbeliever    schedule 03.02.2010
comment
Я сделаю комментарий Дэмиена еще на один шаг: почему вы (или, скорее, люди, предъявляющие вам требования) ограничиваете пароль буквенно-цифровыми символами? В хорошем пароле есть не буквенно-цифровые символы. Активно ли они хотят, чтобы люди использовали неверные пароли? Постарайтесь обучить людей, предъявляющих вам эти требования.   -  person T.J. Crowder    schedule 03.02.2010
comment
но наше требование таково только   -  person Madhu    schedule 03.02.2010
comment
Может быть, они используют SSO для множества систем, а мейнфрейм допускает использование только десяти символов в качестве пароля. Кто знает? Какая разница? Просто ответь уже на извечный вопрос :-)   -  person paxdiablo    schedule 03.02.2010


Ответы (3)


Передайте его через несколько регулярных выражений, если можете. Это будет намного чище, чем эти предсказуемые монстры :-)

^[a-zA-Z0-9]{6,10}$
[a-zA-Z]
[0-9]

Хотя некоторые могут счесть это умным, нет необходимости делать все с одним регулярным выражением (или даже с любым регулярным выражением, иногда — просто посмотрите на людей, которые хотят, чтобы регулярное выражение обнаруживало числа от 75 до 4093).

Вы бы предпочли увидеть хороший чистый код, например:

if not checkRegex(str,"^[0-9]+$")
    return false
val = string_to_int(str);
return (val >= 75) and (val <= 4093)

или что-то вроде:

return checkRegex(str,"^7[5-9]$|^[89][0-9]$|^[1-9][0-9][0-9]$|^[1-3][0-9][0-9][0-9]$|^40[0-8][0-9]$|^409[0-3]$")

Я знаю, какой из них предпочту сохранить :-)

person paxdiablo    schedule 03.02.2010
comment
Вы имеете в виду все это в одном выражении, как показано ниже validationexpression=^([a-zA-Z0-9]{6,10})$[a-zA-Z][0-9] - person Madhu; 03.02.2010
comment
Нет. Я имею в виду что-то вроде: if (!str.match(re1)) return false; если (!str.match(re2)) вернуть false; вернуть str.match(re3); - это три отдельных вызова с тремя отдельными регулярными выражениями. - person paxdiablo; 03.02.2010

Используйте положительный lookahead

^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]{6,10}$

Осмотры также называются утверждениями нулевой ширины. Они имеют нулевую ширину, как начало и конец строки (^, $). Разница в том, что обходные пути на самом деле сопоставляют символы, но затем отказываются от совпадения и возвращают только результат: совпадение или отсутствие совпадения. Вот почему они называются «утверждениями». Они не потребляют символы в строке, а только утверждают, возможно совпадение или нет.

Синтаксис для осмотра:

  • (?=REGEX) Положительный прогноз
  • (?!REGEX) Отрицательный прогноз
  • (?<=REGEX) Положительный взгляд назад
  • (?<!REGEX) Отрицательный ретроспективный анализ
person Amarghosh    schedule 03.02.2010
comment
Спасибо за ваш ответ. Но это не работает. Попробуйте изменить порядок вставки значений. Это не будет работать должным образом - person Madhu; 03.02.2010
comment
Вау, я не наткнулся на это. Имо, он работает как положено, по крайней мере, на Python) - person Rorick; 03.02.2010
comment
попробуйте текст, начинающийся с цифр. Если вы используете алфавиты в начале слова, это работает так, как вы ожидали. Но когда вы начинаете то же самое с числами, это не так (я использую .net с С#). Спасибо за ваше терпение. - person Madhu; 03.02.2010
comment
@Madhu Я протестировал его с помощью экспрессо, и он отлично работает для строк, начинающихся с цифр. (у меня нет среды разработки .net). Опубликуйте пример, который не работает с ним, и мы сможем сказать вам, в чем проблема. - person Amarghosh; 03.02.2010

string r = @"^(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]{6,10}$";
Regex x = new Regex(r);
var z = x.IsMatch(password);

http://www.regular-expressions.info/refadv.html

http://www.regular-expressions.info/lookaround.html

person Brock Hensley    schedule 05.12.2013