2012-01-31 2 views
2

Предположим, у меня есть несколько требований к паролю. Во-первых, пароль должен быть 8-20 символов, а первый и последний символы должны быть альфа-символами, а средние символы - любой комбинацией альфа-чисел, смешанных с несколькими символами. Выражение, которое мне удалось найти до сих пор:Объединить выражения регулярных выражений с AND

^[a-zA-Z] {1} [a-zA-Z0-9 # $! & * @()] {6,18} [a-zA-Z] {1} $

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

Как совместить эти требования в одном выражении, например, что я могу имитировать что-то вроде:

If(Regex.IsMatch(“^[a-zA-Z]{1}[a-zA-Z0-9#$!&*@()]{6,18}[a-zA-Z]{1}$”, userInput) // Check most of the conditions (starts with alpha, ends with alpha, and is 8-20 characters total) 
&& Regex.IsMatch(“[A-Z]”, userInput) // Ensure there’s an upper case 
&& Regex.IsMatch(“[a-z]”, userInput) // Ensure there’s a lower case 
&& Regex.IsMatch(“[0-9]”, userInput) // Ensure there’s a digit 
&& Regex.IsMatch(“[#$!&*@()]”) // Ensure there’s an allowed symbol 
) 
{ 
       // Do something here 
} 

Я понимаю, что оператор OR только |, но есть простой способ «И» условия вместе ? Если нет, то какой рекомендуемый подход?

ответ

2

Я рекомендую написать несколько тестов, как вы это сделали. Составное регулярное выражение, которое вы предлагаете, непрозрачно до уровня неопределенности и настолько сложно отлаживать и поддерживать. Если вы настаиваете на том, чтобы сохранить все в одном регулярном выражении, я предлагаю вам использовать модификатор /x (параметр IgnorePatternWhitespace в MS C++), чтобы вы могли использовать пробельные символы, чтобы сделать его разборчивым, и использовать образы нулевой ширины для ваших утверждений, например это

/^
    (?=.*[A-Z]) 
    (?=.*[a-z]) 
    (?=.*[0-9]) 
    (?=.*[#$!&*@()]) 
    [A-Za-z].{6,18}[A-Za-z] 
    $ 
/x; 
+0

Я думаю, что '(? =. * [AZ])' эквивалентно просто '(? = [AZ])', не так ли? –

+0

Спасибо за '/^$ /' Тим! – Borodin

+0

@Igor: no, '(? =. * [A-Z])' позволяет букве появляться где угодно в строке, тогда как '(? = [A-Z])' настаивает на том, чтобы она находилась в начале строки. Возможно, вы были смущены тем, что я опускал якобы '/^/' и '/ & /' (исправлено Tim)? – Borodin

Смежные вопросы