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

Kotlin删除所有非字母数字字符,kotlin,kotlin-android-extensions,Kotlin,Kotlin Android Extensions,我正在尝试从字符串中删除所有非字母数字字符 我尝试用正则表达式使用replace(),如下所示: var answer = answerEditText.text.toString() Log.d("debug", answer) answer = answer.replace("[^A-Za-z0-9 ]", "").toLowerCase() Log.d("debug", answer) 调试:测试,替换 调试:测试,替换 为什么标点符号仍然存在?如何仅获取字母数字字符?您需要创建一个re

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

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

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

调试:测试,替换


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

您需要创建一个regex对象

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)

在线试用:

您可以在不使用正则表达式的情况下试用,例如:

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 = "")

科特林的标准图书馆就是这样美丽。只需结合使用,如下所示:

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认为您可以替换字符串,但不能替换正则表达式,所以您应该帮助选择使用正则表达式作为第一个参数的正确方法签名

显式使用正则表达式类型而不是字符串:

"[^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()

您需要创建一个正则表达式,这可以通过调用
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_uu525448中测试,我想您需要
replaceAll
String。replace
搜索文本字符串,而
String.replaceAll
搜索正则表达式。您必须创建一个regex对象。否则,您只需替换文本字符串
[^A-Za-z0-9]
,该字符串显然不在您的输入中。虽然我的建议(
replaceAll
)在Java中可以使用,但Kotlin有自己的
string
类,它不包含
replaceAll
的定义。因此,请忽略我的建议。使用
val answer=answerEditText.text.toString().replace(“[^A-Za-z0-9]”。toRegex(),“”)。toLowerCase()
或者
(?i)[^\\w\\d]
-使用\w和\d进行不区分大小写的检查,而不是手动键入matches@AbhijitSarkar,Swift还具有扩展功能。:)@很多语言都有。我的评论是关于上面的答案,并不是普遍适用于所有存在的语言。我想看看它的性能曾经降低到字节码这似乎是浪费,因为它创建了两个临时数组,并没有真正提高可维护性。它只是“感觉”很好,因为它是“功能性的”。问题是我试图从字符串中删除所有非字母数字字符。这个regexp做了一些不同的事情请检查我编辑过的答案,但我不确定你是如何考虑一些特殊字符的,比如aß?在我的回答中,它也将删除它们。。。谢谢你!我添加了一行关于
toRegx()
的内容,作为数字的介绍,这是否更好,也许:
“[^0-9+]”。toRegx()
?但他们在做什么方面是一样的,对吗?