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

Find and replace regex for identification number input mask

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

用户键入其身份证号码的 11 位数字,输出将采用以下格式:

\d\d\d.\d\d\d.\d\d\d-\d\d

第一次尝试

查找:(\d{3})(\d{3})(\d{3})(\d{2})

替换:..-

这仅在用户键入所有 11 位数字后才有效。但是,我希望在用户键入时显示点和破折号。

第二次尝试

查找:(\d{1,3})(\d{1,3})(\d{1,3})(\d{1,2})

替换:..-

当用户输入第四个数字时,结果却变成了这样\d.\d.\d-\d

第三次尝试

查找:(\d{3})(\d{0,3})(\d{0,3})(\d{0,2})

替换:..-

当用户输入第三个数字时,结果却变成了这样\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 = """..-"""
    
    val result = transformation(input, findRegex, replaceRegex)
    
    println(result)
}

https://pl.kotl.in/dPRrIMIVm

可在此处找到完整代码: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,3})?(\d{1,2})?$"""
    val replaceRegex = """..-"""
    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 组
  • $ - 字符串结尾。