Kotlin实现手机号中间位替换为*:仅保留首尾两位
Kotlin实现手机号掩码:保留前后两位,中间替换为*
嘿,作为Kotlin新手遇到这个需求太正常啦,我给你分享几种实用的实现方式,从基础到进阶都有,你可以根据自己的场景选~
方法一:基础字符串操作(新手友好)
这种方式逻辑直白,一步一步拆解字符串,很容易看懂:
- 先清理手机号里的非数字字符(可选,如果你确定输入是纯数字可以跳过)
- 判断手机号长度,如果小于4直接返回原号码(避免索引越界)
- 截取前两位和后两位数字
- 生成对应数量的
*(总长度减去4) - 把三部分拼接起来
代码示例:
fun maskPhoneNumber(phone: String): String { // 过滤掉手机号里的非数字字符,比如空格、-等 val cleanPhone = phone.filter { it.isDigit() } if (cleanPhone.length < 4) { return cleanPhone // 长度不够时直接返回原号码 } val prefix = cleanPhone.substring(0, 2) val suffix = cleanPhone.substring(cleanPhone.length - 2) val mask = "*".repeat(cleanPhone.length - 4) return "$prefix$mask$suffix" } // 调用测试 fun main() { val originalPhone = "13812345678" println(maskPhoneNumber(originalPhone)) // 输出:13******78 }
方法二:正则表达式(更简洁)
如果想写得更紧凑,可以用Kotlin的正则替换功能,通过分组匹配前后两位,中间部分替换成对应数量的*:
代码示例:
fun maskPhoneNumberRegex(phone: String): String { val cleanPhone = phone.filter { it.isDigit() } if (cleanPhone.length < 4) return cleanPhone return cleanPhone.replace(Regex("(\\d{2})(\\d+)(\\d{2})")) { matchResult -> "${matchResult.groupValues[1]}${"*".repeat(cleanPhone.length - 4)}${matchResult.groupValues[3]}" } } // 调用测试 fun main() { val originalPhone = "9876543210" println(maskPhoneNumberRegex(originalPhone)) // 输出:98******10 }
这里的正则(\\d{2})(\\d+)(\\d{2})会把手机号拆成三组:前两位、中间所有数字、后两位,再用分组值加掩码拼接成最终结果。
小提醒
- 一定要处理长度不足4的情况,不然会抛出索引越界异常
- 如果业务允许手机号带非数字符号,记得先做清理步骤,避免掩码出错
内容的提问来源于stack exchange,提问作者ananya




