Kotlin 删除所有非字母数字字符

Kotlin Remove all non alphanumeric characters

我正在尝试从字符串中删除所有非字母数字字符。

我尝试将 replace() 与正则表达式一起使用,如下所示:

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

D/debug: Test. ,replace

D/debug: test. ,replace

为什么标点符号仍然存在?如何只获取字母数字字符?

您需要创建一个正则表达式对象

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

你可以试试不使用正则表达式,例如:

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

我发现这更加简洁和可维护。会不会是之前的回答是在添加这些扩展之前做出的?

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

Kotlin的标准库就是这么美。只需使用 String.filter combined with Char.isLetterOrDigit,像这样:

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

我认为这是最简单的方法:

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

Kotlin 认为您替换的是字符串,而不是正则表达式,因此您应该帮助选择正确的方法签名,并将正则表达式作为第一个参数。

明确使用 Regex 类型而不是字符串:

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

或者告诉您正在传递命名的正则表达式参数:

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

在这种情况下,kotlin 不会编译,除非你传递真正的正则表达式,而不是字符串

fun String.digitsOnly(): String{
    val regex = Regex("[^0-9]")
    return regex.replace(this, "")
}
fun String.alphaNumericOnly(): String{
    val regex = Regex("[^A-Za-z0-9 ]")
    return regex.replace(this, "")
}

用法:

val alphaNumeric = "my string #$".alphaNumericOnly()

您需要创建一个正则表达式,这可以通过 str.toRegex() 在调用 replace

之前完成
val string = "AsAABa3a35e8tfyz.a6ax7xe"
string = string.replace(("[^\d.]").toRegex(), "")

结果:3358.67

如果您需要处理单词 W 和空格

var string = "Test in@@ #Kot$#lin   FaaFS@@#$%^&StraßeFe.__525448=="
    string = string.replace(("[^\w\d ]").toRegex(), "")
    println(string)

结果:在 Kotlin 中测试 FaaFSStraeFe__525448