查找并替换识别号输入掩码的正则表达式
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中的正则表达式调整时间码