查找和替换标识号输入掩码的正则表达式

时间:2021-07-16 16:27:57

标签: regex masking input-mask

我想帮助使用查找和替换正则表达式为以下用例创建输入掩码:

用户输入他的识别号的 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,3})(\d{1,3})(\d{1,2})

替换:$1.$2.$3-$4

只要用户输入第四个数字,结果就会像这样\d.\d.\d-\d

第三次尝试

查找:(\d{3})(\d{0,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://pl.kotl.in/dPRrIMIVm

完整代码可以在这里找到:https://gitlab.com/pertence/masked-textinput

1 个答案:

答案 0 :(得分:1)

你可以使用

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,3})?(\d{1,2})?$"""
    val replaceRegex = """$1.$2.$3-$4"""
    val result = transformation(input, findRegex, replaceRegex)
    println(result)
}

参见online Kotlin demo

注意

  • .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,3})?(\d{1,3})?(\d{1,2})?$

参见regex demo详情

  • ^ - 字符串的开始
  • (\d{3}) - 第 1 组:三位数
  • (\d{1,3})? - 匹配一位、两位或三位数字的可选组 2
  • (\d{1,3})? - 匹配一位、两位或三位数字的可选组 3
  • (\d{1,2})? - 匹配一位或两位数字的可选组 4
  • $ - 字符串结束。