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. заменить
Почему символы пунктуации все еще присутствуют? Как получить только буквенно-цифровые символы?
Ответы
Ответ 1
Вам нужно создать объект регулярного выражения
var answer = "Test. ,replace"
println(answer)
answer = answer.replace("[^A-Za-z0-9 ]", "") // doesn't work
println(answer)
val re = Regex("[^A-Za-z0-9 ]")
answer = re.replace(answer, "") // works
println(answer)
Попробуйте онлайн: https://try.kotlinlang.org/#/UserProjects/ttqm0r6lisi743f2dltveid1u9/2olerk6jvb10l03q6bkk1lapjn
Ответ 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 не будет компилироваться, если вы не передадите реальное регулярное выражение, а не строку