Регулярное выражение в Android для поля пароля

Как я могу проверить EditText с помощью Regex, разрешив определенные символы. Мое условие:

Правило пароля:

  • Одна заглавная буква
  • Одно число
  • Один символ (@,$,%,&,#,) любые нормальные символы, которые являются приемлемыми.

    Могу ли я узнать, что является правильным способом достижения моей цели?

Ответы

Ответ 1

Попробуйте это, может помочь

^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{4,}$

Как это работает?

^                 # start-of-string
(?=.*[0-9])       # a digit must occur at least once
(?=.*[a-z])       # a lower case letter must occur at least once
(?=.*[A-Z])       # an upper case letter must occur at least once
(?=.*[@#$%^&+=])  # a special character must occur at least once you can replace with your special characters
(?=\\S+$)          # no whitespace allowed in the entire string
.{4,}             # anything, at least six places though
$                 # end-of-string

Как реализовать?

public class MainActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final EditText editText = (EditText) findViewById(R.id.edtText);
        Button btnCheck = (Button) findViewById(R.id.btnCheck);

        btnCheck.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                if (isValidPassword(editText.getText().toString().trim())) {
                    Toast.makeText(MainActivity.this, "Valid", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, "InValid", Toast.LENGTH_SHORT).show();
                }
            }
        });

    }

    public boolean isValidPassword(final String password) {

        Pattern pattern;
        Matcher matcher;

        final String PASSWORD_PATTERN = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{4,}$";

        pattern = Pattern.compile(PASSWORD_PATTERN);
        matcher = pattern.matcher(password);

        return matcher.matches();

    }

}

Ответ 2

Попробуйте это.

(/^(?=.*\d)(?=.*[A-Z])([@$%&#])[0-9a-zA-Z]{4,}$/)


(/^
(?=.*\d)                //should contain at least one digit
(?=.*[@$%&#])           //should contain at least one special char
(?=.*[A-Z])             //should contain at least one upper case
[a-zA-Z0-9]{4,}         //should contain at least 8 from the mentioned characters
$/)

Ответ 3

А для любителей котлина:

fun isValidPassword(password: String?) : Boolean {
   password?.let {
       val passwordPattern = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{4,}$"
       val passwordMatcher = Regex(passwordPattern)

       return passwordMatcher.find(password) != null
   } ?: return false
}

Ответ 4

try {
    if (subjectString.matches("^(?=.*[@$%&#_()=+?»«<>£§€{}\\[\\]-])(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).*(?<=.{4,})$")) {
        // String matched entirely
    } else {
        // Match attempt failed
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}


(?=.*[@\$%&#_()=+?»«<>£§€{}.[\]-]) -> must have at least 1 special character
(?=.*[A-Z])   -> Must have at least 1 upper case letter
(?=.*[a-z])   -> Must have at least 1 lower case letter
(?=.*\\d)     -> Must have at least 1 digit
(?<=.{4,})$") -> Must be equal or superior to 4 chars.

Ответ 5

вы можете использовать класс Patern, чем Matcher для каждого формата проверки.

Я даю вам пример использования:

        Pattern pattern = Pattern.compile("[email protected]+\\.[a-z]+");
        Matcher matcher = pattern.matcher(myEmailString);
        if (!myEmailString.contains("@") || !matcher.matches()) {
            // error in the email : do staff 
            myEmailView.setError("invalid email !");

        }

Ответ 6

Я слишком поздно, чтобы ответить, но все же это может помочь вам.

Я работал с Kotlin.

Добавьте следующую функцию.

private fun isValidPassword(password: String): Boolean {
    val pattern: Pattern
    val matcher: Matcher
    val specialCharacters = "[email protected]%\\[\\}+'!/#$^?:;,\\(\"\\)~'.*=&\\{>\\]<_"
    val PASSWORD_REGEX = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[$specialCharacters])(?=\\S+$).{8,20}$"
    pattern = Pattern.compile(PASSWORD_REGEX)
    matcher = pattern.matcher(password)
    return matcher.matches()
}

Описание функции:

  • (? =. * [0-9]) # цифра должна встречаться хотя бы один раз
  • (? =. * [az]) # строчная буква должна встречаться хотя бы один раз
  • (? =. * [AZ]) # заглавная буква должна встречаться хотя бы один раз
  • (? =. [- @% [} + '!/# $ ^?:;, (") ~'. = & {>] <_]) # специальный символ должен встречаться хотя бы один раз и заменяться вашими специальными символами
  • (? =\S+ $) # запрещены пробелы во всей строке. {8,} # что угодно, хотя бы шесть мест

Вы можете изменить его по мере необходимости.

Надеюсь, поможет.

Ответ 7

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

Сначала разделите его: вместо того, чтобы создавать одно большое правило, разделите его и проверьте каждое правило отдельно, чтобы вы могли предоставить пользователю обратную связь о том, что именно не так с его паролем. Это может занять немного больше времени, но при проверке пароля это не будет заметно. Кроме того, таким образом, условия более читабельны.

Во-вторых, вместо проверки списка специальных символов вы можете перевернуть его и проверить, содержит ли пароль какие-либо символы, которые не являются ни буквами латинского алфавита (a-zA-Z), ни цифрами (0-9). Таким образом, вы не "забудете" специальные символы. Например, допустим, что вы проверяете конкретно, но при проверке вы забываете символ типа "{". При таком подходе этого не может быть. Вы можете расширить этот список с помощью вещей, которые вы явно не считаете специальными символами, для пример пробела. В kotlin это будет выглядеть так:

val errorText = when {
    /* Rule 1 */
    !password.contains(Regex("[A-Z]")) -> "Password must contain one capital letter"
    /* Rule 2 */
    !password.contains(Regex("[0-9]")) -> "Password must contain one digit"
    /* Rule 3, not counting space as special character */
    !password.contains(Regex("[^a-zA-Z0-9 ]")) -> "Password must contain one special character"
    else -> null
}

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

Reges("[\x00-\x7F]")