android - 选择字符串中的前 X 位数字并将每个数字替换为 Character

标签 android regex kotlin

我正在尝试用 * 替换字符串中的所有数字。

现在我有这个

val regex = "^[\\d+].{8}"
val pattern = Pattern.compile(regex)
code = code.replace(pattern.toRegex(), "*** *** *")

它有点管用,但我想要 * 而不是 "*** *** *" 所以想法是替换单个数字而不是 block 。

示例字符串:

123 456 789 0

最佳答案

一种可读的正则表达式方法是匹配从字符串开头到第 8 位的任意数量的字符,然后将匹配传递给一个 block 并用数字模式替换第二次:

val s = "123 456 789 0"
val regex = """^(?:\D*\d){8}""".toRegex()
println(s.replace(regex) { it.value.replace(Regex("""\d"""), "*") })
// => *** *** **9 0

查看 Kotlin demo online

^(?:\D*\d){8} 正则表达式匹配

  • ^ - 字符串开始
  • (?:\D*\d){8} - 重复 8 次:
    • \D* - 0 个或多个数字以外的字符
    • \d - 一个数字。

仅供引用,您可以使用具有八个捕获组的硬编码版本实现相同的效果,s.replace("""^(\D*)\d(\D*)\d(\D*)\d(\D*)\d(\D*)\d(\D*)\d(\D*)\d(\D*)\d""".toRegex(), "$1*$2* $3*$4*$5*$6*$7*$8*") 如果输入字符串中始终有 8 位数字。

关于android - 选择字符串中的前 X 位数字并将每个数字替换为 Character,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55265028/

相关文章:

android - 在 Activity 中处理 AsyncTask.doInBackground 中的异常?

python re 模块 - 用于提取文本片段的正则表达式

Kotlin Flow 仅每秒收集一次

android - 左边距不适用于 java

java - 如果不存在则插入,否则根据用户的选择更新 android

java - 有效地查找正则表达式的所有重叠匹配项

javascript - 使用正则表达式限制文本框中的输入

android - 将 Android Material Components 版本从 1.0.0 更新到 1.1.0,颜色全乱了

swift - 可以扩展 Kotlin 类以符合接口(interface)(就像 Swift 类一样)吗?

java - 为什么日历值不同?