web-dev-qa-db-fra.com

Kotlin Supprimer tous les caractères non alphanumériques

J'essaie de supprimer tous les caractères non alphanumériques d'une chaîne.

J'ai essayé d'utiliser replace() avec une expression régulière comme suit:

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

D/debug: test. ,remplacer

D/debug: test. ,remplacer

Pourquoi les caractères de ponctuation sont-ils toujours présents? Comment obtenir uniquement les caractères alphanumériques?

20
Distwo

Vous devez créer un objet 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)

Essayez-le en ligne: https://try.kotlinlang.org/#/UserProjects/ttqm0r6lisi743f2dltveid1u9/2olerk6jvb10l03q6bkk1lapjn

37
hasen

Je trouve que c'est beaucoup plus succinct et maintenable. Se pourrait-il que les réponses précédentes aient été apportées avant l'ajout de ces extensions?

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

La bibliothèque standard de Kotlin est magnifique comme ça. Utilisez simplement String.filter combiné avec Char.isLetterOrDigit , comme ceci:

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

Vous pouvez essayer sans regex, par exemple:

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

Je pense que c'est la manière la plus simple:

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