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

75

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

我尝试使用以下正则表达式的 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: 测试。 ,替换

为什么标点符号还在呢?如何只获取字母数字字符?


我认为你想要使用 replaceAll - user94559
String.replace 搜索字面字符串,而 String.replaceAll 搜索正则表达式。 - user94559
你必须创建一个正则表达式对象。否则,你只是替换字面字符串 [^A-Za-z0-9 ] 的出现,这显然不在你的输入中。 - hasen
7
虽然我的建议(replaceAll)在Java中可以使用,但是Kotlin有自己的String类,其中不包含replaceAll的定义。因此请忽略我的建议。 - user94559
8个回答

102

10
将输入框的文本转换为小写形式并删除所有非字母数字字符:val answer = answerEditText.text.toString().replace("[^A-Za-z0-9 ]".toRegex(), "").toLowerCase() - Distwo
2
或者使用 (?i)[^\\w\\d ] 进行大小写不敏感的检查,而不是手动输入匹配项。 - Zoe stands with Ukraine
@AbhijitSarkar,Swift 也有扩展函数。 :) - CoolMind
@CoolMind 许多编程语言都有这样的特点。我的评论是针对上面的答案,而不是普遍适用于所有存在的编程语言。 - Abhijit Sarkar

93

Kotlin的标准库就是这么优美。只需使用String.filter结合Char.isLetterOrDigit,如下所示:

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

有趣的事实。这个过滤器不会过滤掉π符号。因为它是希腊字母表中的一个字母,所以被视为一个字母。TIL - jeepGirl90

25

您需要创建一个正则表达式,这可以通过在调用replace之前使用str.toRegex()来完成。

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


1
问题是关于“我正在尝试从字符串中删除所有非字母数字字符。” 这个正则表达式做了一些不同的事情。 - Simson
1
请检查我的修改答案,但我不确定你是否考虑了一些特殊字符,比如 à ß?在我的答案中,它也会将它们删除...谢谢。 - Fakhar
2
更好了!我添加了一行关于 toRegx() 的介绍。 - Simson

19

我觉得这种方式更加简洁易维护。可能之前的回答是在这些扩展添加之前发表的?

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

1
我很想看看将其转换为字节码后的性能如何。 - Tom
这似乎很浪费,因为它会创建两个临时数组,并没有真正增加可维护性。这只是因为它是“函数式”的感觉很好。 - hasen

14

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

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

11
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()

对于仅包含数字,这样做是否更好:"[^0-9+]".toRegex()?从功能上来说,它们是相同的,对吗? - android developer

2

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

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

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

或者说明你正在传递命名的正则表达式参数:
answer.replace(regex = "[^A-Za-z0-9 ]", "")

在这种情况下,Kotlin只有在您传递真正的正则表达式而不是字符串时才会编译


2

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

最初的回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接