Kotlin, не могу сопоставить регулярные выражения - PullRequest
1 голос
/ 07 апреля 2020

Пытались часами заставить эту простую проверку работать. Кажется, что бы я ни пытался проверить, результаты противоречивы ..

    fun validatePassword(password: Password): Boolean {
    val noUpper = "(?=.*[A-Z])".toRegex()
    val noLower = "(?=.*[a-z])".toRegex()
    val noDigit = "(?=.*\\d)".toRegex()

    when {
        !password.newPassword.matches(noUpper) -> {
            throw WebApplicationException("Password missing uppercase letter")
        }
        !password.newPassword.matches(noLower) -> {
            throw WebApplicationException("Password missing digit")
        }
        !password.newPassword.matches(noDigit) -> {
            throw WebApplicationException("Password missing lowercase letter")
        }
        else -> return true
    }
}

Я не слишком хорошо разбираюсь в регулярных выражениях .. как мне заставить их проверять должным образом ошибки, показанные здесь?

Спасибо

1 Ответ

0 голосов
/ 07 апреля 2020

Метод matches() требует полного совпадения строк, и ваши регулярные выражения соответствуют только пустому расположению, за которым следуют любые 0+ символов, кроме символов разрыва строки, за которыми следуют либо прописные или строчные буквы, либо ди git. Вам необходимо сопоставить и использовать всю строку.

Одно из исправлений - изменить только регулярные выражения и использовать оставшуюся часть кода следующим образом:

val noUpper = "(?s)[^A-Z]*[A-Z].*".toRegex()
val noLower = "(?s)[^a-z]*[a-z].*".toRegex()
val noDigit = "(?s)\\D*\\d.*".toRegex()

Или использовать find() (что позволяет частичное совпадение внутри более длинных строк) с немного более простыми регулярными выражениями:

val noUpper = "[A-Z]".toRegex()
val noLower = "[a-z]".toRegex()
val noDigit = "\\d".toRegex()

и затем

when {
    noUpper.find(password) == null -> {
        throw WebApplicationException("Password missing uppercase letter")
    }
    noLower.find(password) == null -> {
        throw WebApplicationException("Password missing digit")
    }
    noDigit.find(password) == null -> {
        throw WebApplicationException("Password missing lowercase letter")
    }
    else -> return true
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...