11位身份证号输入掩码的查找替换正则表达式实现咨询
11位身份证号实时输入掩码正则实现方案
需求说明
实现11位身份证号输入过程中实时格式化为\d\d\d.\d\d\d.\d\d\d-\d\d格式,输入过程中无多余分隔符,满11位后自动停止格式化。
实现方案
方案1:三次正则替换(无回调,逻辑简单)
核心逻辑为仅当当前段后还有输入内容时,才插入对应分隔符,避免提前出现多余符号:
- 第一步插入第一个
.:
查找规则:(\d{3})(?=\d)
替换规则:$1. - 第二步插入第二个
.:
查找规则:(\d{3}\.\d{3})(?=\d)
替换规则:$1. - 第三步插入
-:
查找规则:(\d{3}\.\d{3}\.\d{3})(?=\d)
替换规则:$1-
Kotlin代码示例
fun transformation(input: String): String { // 先过滤非数字字符,限制最大输入11位 val pureDigits = input.replace(Regex("\\D"), "").take(11) return pureDigits .replace(Regex("(\\d{3})(?=\\d)"), "$1.") .replace(Regex("(\\d{3}\\.\\d{3})(?=\\d)"), "$1.") .replace(Regex("(\\d{3}\\.\\d{3}\\.\\d{3})(?=\\d)"), "$1-") } fun main() { // 测试不同输入长度 listOf("1", "123", "1234", "123456", "1234567", "123456789", "1234567890", "12345678901") .forEach { println("输入$it → 输出${transformation(it)}") } }
测试效果
| 输入 | 输出 |
|---|---|
| 123 | 123 |
| 1234 | 123.4 |
| 123456 | 123.456 |
| 1234567 | 123.456.7 |
| 123456789 | 123.456.789 |
| 1234567890 | 123.456.789-0 |
| 12345678901 | 123.456.789-01 |
方案2:单正则匹配+替换回调
如果希望仅做一次正则匹配,可使用带匹配结果回调的替换方式:
查找规则:^(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,2})?$
Kotlin代码示例
fun transformation(input: String): String { val pureDigits = input.replace(Regex("\\D"), "").take(11) val regex = Regex("^(\\d{1,3})(\\d{1,3})?(\\d{1,3})?(\\d{1,2})?$") return regex.replace(pureDigits) { val p1 = it.groupValues[1] val p2 = it.groupValues[2].takeIf { s -> s.isNotEmpty() }?.let { s -> ".$s" } ?: "" val p3 = it.groupValues[3].takeIf { s -> s.isNotEmpty() }?.let { s -> ".$s" } ?: "" val p4 = it.groupValues[4].takeIf { s -> s.isNotEmpty() }?.let { s -> "-$s" } ?: "" "$p1$p2$p3$p4" } }
两种方案效果完全一致,可根据实际场景选择。
内容的提问来源于stack exchange,提问作者Augusto Pertence
相关产品推荐
相关产品推荐

