Выбрать первые X цифр в строке и заменить каждую цифру символом - PullRequest
1 голос
/ 20 марта 2019

Я пытаюсь заменить все цифры в строке на *.

Прямо сейчас у меня есть это

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

Это вроде работает, но я хочу иметь * вместо "*** *** *" поэтому идея состоит в том, чтобы заменить одну цифру вместо блока.

пример строки:

123 456 789 0

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Удобный для чтения подход регулярного выражения состоит в том, чтобы сопоставить любое количество символов от начала строки до 8-й цифры, а затем передать совпадение в блок и заменить второй раз цифрой:

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

См. Демоверсию Kotlin онлайн

Регулярное выражение ^(?:\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 цифр во входной строке.

0 голосов
/ 20 марта 2019

Вместо регулярного выражения вы, вероятно, просто хотите повторять n количество раз, пока не замените нужное количество символов. Используя функциональный подход, вы можете сделать что-то вроде:

fun String.redact(numDigits:Int = 8): String {
    val charArray = toCharArray()

    charArray.withIndex()
        .filter { (_, char) -> Character.isDigit(char) }
        .take(numDigits)
        .forEach { (index, _) -> charArray[index] = '*' }

    return String(charArray)
}

Тогда:

println("123 456 789 0".redact()) // *** *** **9 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...