Метод 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
}