问题描述
我想帮助使用查找和替换正则表达式为以下用例创建输入掩码:
用户输入他的识别号的 11 位数字,输出将使用以下格式进行格式化:
\d\d\d.\d\d\d.\d\d\d-\d\d
第一次尝试
查找:(\d{3})(\d{3})(\d{3})(\d{2})
替换:$1.$2.$3-$4
这仅在用户输入所有 11 位数字后才有效。但是,我希望在用户键入时显示点和破折号。
第二次尝试
查找:(\d{1,3})(\d{1,2})
替换:$1.$2.$3-$4
只要用户输入第四个数字,结果就会像这样\d.\d.\d-\d
第三次尝试
查找:(\d{3})(\d{0,3})(\d{0,2})
替换:$1.$2.$3-$4
只要用户输入第三个数字,结果就会变成这样\d\d\d\..-
代码:
代码的简要说明:
fun transformation(input: String,findRegex: String,replaceRegex: String): String =
input.replace(findRegex.toRegex(),replaceRegex)
fun main() {
val input = "01121212"
val findRegex = """(\d{3})(\d{3})(\d{3})(\d{2})"""
val replaceRegex = """$1.$2.$3-$4"""
val result = transformation(input,findRegex,replaceRegex)
println(result)
}
完整代码可以在这里找到:https://gitlab.com/pertence/masked-textinput
解决方法
你可以使用
fun transformation(input: String,findRegex: String,replaceRegex: String): String =
input.replace("""\D+""".toRegex(),"").replace(findRegex.toRegex(),{
it.groupValues[1].toString() +
(if (!it.groupValues[2].isNullOrEmpty()) ".${it.groupValues[2].toString()}" else "") +
(if (!it.groupValues[3].isNullOrEmpty()) ".${it.groupValues[3].toString()}" else "") +
(if (!it.groupValues[4].isNullOrEmpty()) "-${it.groupValues[4].toString()}" else "")
})
fun main(args: Array<String>) {
val input = "0112121234" // 011.212.123-4
// val input = "011" // 011
// val input = "01121212" // 011.212.12
// val input = "011212" // 011.212
// val input = "01121" // 011.21
// val input = "0112" // 011.2
val findRegex = """^(\d{3})(\d{1,3})?(\d{1,2})?$"""
val replaceRegex = """$1.$2.$3-$4"""
val result = transformation(input,findRegex,replaceRegex)
println(result)
}
注意:
-
.replace("""\D+""".toRegex(),"")
- 删除所有非数字 -
.replace(findRegex.toRegex(),{ it.groupValues[1].toString() + (if (!it.groupValues[2].isNullOrEmpty()) ".${it.groupValues[2].toString()}" else "") + (if (!it.groupValues[3].isNullOrEmpty()) ".${it.groupValues[3].toString()}" else "") + (if (!it.groupValues[4].isNullOrEmpty()) "-${it.groupValues[4].toString()}" else "") })
- 匹配一个模式并根据组是否匹配使用不同的替换来替换匹配。
正则表达式是
^(\d{3})(\d{1,2})?$
参见regex demo。 详情:
-
^
- 字符串的开始 -
(\d{3})
- 第 1 组:三位数 -
(\d{1,3})?
- 匹配一位、两位或三位数字的可选组 2 -
(\d{1,3})?
- 匹配一位、两位或三位数字的可选组 3 -
(\d{1,2})?
- 匹配一位或两位数字的可选组 4 -
$
- 字符串结束。