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

Posted

技术标签:

【中文标题】查找并替换识别号输入掩码的正则表达式【英文标题】:Find and replace regex for identification number input mask 【发布时间】:2021-07-16 16:27:57 【问题描述】:

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

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

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

第一次尝试

查找:(\d3)(\d3)(\d3)(\d2)

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

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

第二次尝试

查找:(\d1,3)(\d1,3)(\d1,3)(\d1,2)

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

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

第三次尝试

查找:(\d3)(\d0,3)(\d0,3)(\d0,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 = """(\d3)(\d3)(\d3)(\d2)"""

    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

【问题讨论】:

您忘记使用通过反向引用引用的捕获组。 这个答案***.com/a/37681441/4770439 有效并且与我的第一次尝试相同,但我希望在用户输入时出现点和破折号。 抱歉,正则表达式适用于纯文本。当用户键入时,有一些代码会处理输入并应用正则表达式。你的代码是什么?另请参阅Input mask doesn't work when value is deleted 我将代码示例放在问题中。我知道还有其他关于使用 android compose 进行输入屏蔽的问题,但我想创建一个不需要为每个屏蔽模式自定义逻辑的类。 我觉得你需要this kind of solution。 【参考方案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 = """^(\d3)(\d1,3)?(\d1,3)?(\d1,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 "") ) - 匹配一个模式,并根据组是否匹配,用不同的替换替换匹配。

正则表达式是

^(\d3)(\d1,3)?(\d1,3)?(\d1,2)?$

请参阅regex demo。 详情

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

【讨论】:

以上是关于查找并替换识别号输入掩码的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

使用Microsoft Word 2016中的正则表达式调整时间码

#转#VS2012 正则表达式 动态插入 动态替换 (查找和替换工具)

EditPlus 用正则表达式去除空格并添加一些字符

sublime text怎么使用高级正则查找替换

notepad正则怎么替换其中一部分

正则表达式的基础问题