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
我正在尝试从字符串中删除所有非字母数字字符。
我尝试将 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