如何使用Kotlin实现符合指定规则的优雅密码校验功能
Kotlin 密码校验优雅实现方案
这里提供两种实现方案,你可以根据自己的业务场景选择:
方案1:无正则高可读版本(推荐)
不需要写正则,规则逻辑一目了然,还支持返回具体的校验失败原因,方便业务侧直接使用:
// 定义校验结果密封类 sealed class PasswordValidationResult { object Valid : PasswordValidationResult() data class Invalid(val errorMsg: String) : PasswordValidationResult() } // 给String加扩展方法,直接调用即可 fun String.validatePassword(): PasswordValidationResult { return when { length < 8 -> PasswordValidationResult.Invalid("密码长度不能少于8个字符") !any { it.isLowerCase() } -> PasswordValidationResult.Invalid("密码需要包含至少1个小写字母") !any { it.isUpperCase() } -> PasswordValidationResult.Invalid("密码需要包含至少1个大写字母") !any { it.isDigit() } -> PasswordValidationResult.Invalid("密码需要包含至少1个数字") !any { !it.isLetterOrDigit() } -> PasswordValidationResult.Invalid("密码需要包含至少1个特殊字符") else -> PasswordValidationResult.Valid } }
使用示例
fun main() { val testPassword1 = "Abc123!+" val testPassword2 = "abc12345" when(val res = testPassword1.validatePassword()) { PasswordValidationResult.Valid -> println("校验通过") is PasswordValidationResult.Invalid -> println("校验失败:${res.errorMsg}") } // 输出:校验通过 when(val res = testPassword2.validatePassword()) { PasswordValidationResult.Valid -> println("校验通过") is PasswordValidationResult.Invalid -> println("校验失败:${res.errorMsg}") } // 输出:校验失败:密码需要包含至少1个大写字母 }
方案优势
- 没有正则学习和维护成本,后续修改规则直接加判断分支即可
- 直接返回具体错误原因,不需要额外做错误映射
- 性能足够,密码字符长度普遍在20位以内,多次遍历的开销可以忽略不计
方案2:正则简洁版本
如果只需要判断是否合法,不需要错误原因,用正则实现代码更短:
fun String.isValidPassword(): Boolean { val passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^A-Za-z0-9]).{8,}$".toRegex() return passwordRegex.matches(this) }
使用示例
println("Abc123!+".isValidPassword()) // 输出 true println("abc12345".isValidPassword()) // 输出 false
内容的提问来源于stack exchange,提问作者Popovych Taras
相关产品推荐
相关产品推荐

