Kotlin Удалить все не буквенно-цифровые символы

Я пытаюсь удалить все не буквенно-цифровые символы из строки.

Я попытался использовать replace() с регулярным выражением следующим образом:

var answer = answerEditText.text.toString()
Log.d("debug", answer)
answer = answer.replace("[^A-Za-z0-9 ]", "").toLowerCase()
Log.d("debug", answer)

D/debug: Тест. заменить

D/debug: test. заменить

Почему символы пунктуации все еще присутствуют? Как получить только буквенно-цифровые символы?

Ответы

Ответ 2

Я считаю, что это гораздо более кратким и ремонтопригодным. Может быть, предыдущие ответы были сделаны до того, как были добавлены эти расширения?

val alphaNumericString = someString.toCharArray()
   .filter { it.isLetterOrDigit() }
   .joinToString(separator = "")

Ответ 3

Стандартная библиотека Kotlin прекрасна, как это. Просто используйте String.filter в сочетании с Char.isLetterOrDigit, например:

val stringToFilter = "A1.2-b3_4C"
val stringWithOnlyDigits = stringToFilter.filter { it.isLetterOrDigit() }
println(stringWithOnlyDigits) //Prints out "A12b34C"

Ответ 4

Вы можете попробовать без регулярных выражений, например:

val ranges = ('0'..'9') + ('a'..'z') + ('A'..'Z')
val escaped = "1! at __ 2? at 345..0986 ZOk".filter { it in ranges }

Ответ 5

Я думаю, что это самый простой способ:

fun String.toNumericString() = this.filter { it.isDigit() }

Ответ 6

Котлин считает, что вы подставляете строку, а не регулярное выражение, поэтому вам следует немного помочь выбрать правильную сигнатуру метода с регулярным выражением в качестве первого аргумента.

Явно используйте тип Regex вместо строки:

"[^A-Za-z0-9 ]".toRegex()

или сообщите, что вы передаете именованный параметр регулярного выражения:

answer.replace(regex = "[^A-Za-z0-9 ]", "")

и в этом случае kotlin не будет компилироваться, если вы не передадите реальное регулярное выражение, а не строку