2013-05-02 2 views
1

Я пытаюсь проверить, что пароль имеет хотя бы одну букву и номер. Не похоже на работу.C# Regex по крайней мере одна буква и по крайней мере одно число

пароль может быть «Tester1» или «11111111t» и т.д.

не может быть все буквы или все цифры.

Любые идеи?

const string pattern = @"/[a-z].*\d|\d.*[a-z]/"; 
var match = Regex.Match(password, pattern); 

Решено:

var rule1 = password.Any(char.IsLetter); 
var rule2 = password.Any(char.IsNumber); 

это работало так:

const string pattern = @"[a-z].*\d|\d.*[a-z]"; 
+2

Если это не * должны * не использовать регулярное выражение. Таким образом было бы легче поддерживать, проще добавлять новые правила. Например, см. Первый ответ и подумайте, что вы хотите добавить новые условия для паролей. – I4V

+0

Я лично проверил 2 регулярных выражения, один для букв и 1 для чисел. это проще, так как –

+0

@SamIam Нет необходимости в регулярном выражении делать то, что вы говорите. – I4V

ответ

5

Вместо использования регулярного выражения я бы использовал простые правила, которые упростили бы поддержку. Например:

var rule1 = str.All(char.IsLetter); 
var rule2 = str.All(char.IsNumber); 

И вы можете обогатить свои правила, char.IsLower, char.IsUpper и т.д.

+6

'str.Any()', no? (Хотя я сочувствую не-регулярному подходу!) – dlev

+0

@dlev, если rule1 или rule2 истинно, тогда не принимайте его как passwd. – I4V

+0

@ I4V Этот отрицательный подход не сработает. Возьмите пустую строку или строку, содержащую только символы, которые не являются ни буквами, ни цифрами.Они, безусловно, содержат «по крайней мере одно письмо и хотя бы одно число», но оба ваших правила оцениваются как ложные. – CodesInChaos

2

вот один

((.*\d.*[a-zA-Z].*)|(.*[a-zA-Z].*\d.*)) 
1

Slashes вокруг шаблон используется в языках, имеет регулярные выражения литералов , У C# этого нет.

Удалите слеши из шаблона:

const string pattern = @"[a-z].*\d|\d.*[a-z]"; 
2

Это сделает это ...

^(?=.*[a-zA-Z])(?=.*[0-9]).+$ 

Я использую positive lookaheads(?=) для достижения этой цели, а затем позволяя любой символ . один или больше раз. Таким образом, пользователю разрешено вводить специальные символы, знаки препинания и т. Д.

+0

Я бы, вероятно, сделал эти '. *' Не-жадные. Зачем проверять всю строку, если вы знаете что-то рядом с началом, это не письмо (или впоследствии цифра)? –

+0

@ Кеннет - Так что бы вы изменили? –

+0

Просто сделайте это не жадным: '. *?'. Впрочем, дело не в этом. –