Je peux utiliser ceci:
String str = "TextX Xto modifyX";
str = str.replace('X','');//that does not work because there is no such character ''
Existe-t-il un moyen de supprimer toutes les occurrences de caractère X
d'une chaîne en Java?
J'ai essayé ça et ce n'est pas ce que je veux: str.replace('X',' '); //replace with space
Réponses:
Essayez d'utiliser la surcharge qui prend des
CharSequence
arguments (par exemple,String
) plutôt quechar
:la source
CharSequence
. docs.oracle.com/javase/7/docs/api/java/lang/…X
de type char?toString
premier. Donc, votre code ressemblerait à quelque chosestr = str.replace(yourChar.toString(), "");
str = str.replace("\uffff", "");
En utilisant
marchera.
L'utilisation serait
str.replace("X", "");
.Exécution
Retour:
la source
replace
surcharge qui prend un simpleCharSequence
.Si vous voulez faire quelque chose avec Java Strings, Commons Lang StringUtils est un endroit idéal pour regarder.
la source
replace
.Ceci est l'exemple pour lequel j'ai supprimé le caractère - de la chaîne.
la source
J'aime utiliser RegEx à cette occasion:
où g signifie global donc il passera par toute votre chaîne et remplacera tous les X par ''; si vous voulez remplacer X et x, vous dites simplement:
(voir mon violon ici: violon )
la source
Bonjour Essayez ce code ci-dessous
la source
Utilisez replaceAll au lieu de replace
Cela devrait vous donner la réponse souhaitée.
la source
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher( this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
la source
input = "deletes all blanks too";
donne "deletesalllankstoo"voici une fonction lambda qui supprime tous les caractères passés en chaîne
String str = "TextX XYto modifyZ";
deleteChars.apply( str, "XYZ" ); // –> "Text to modify"
Cette solution tient compte du fait que la chaîne résultante - à la différence de
replace()
- ne devient jamais plus grande que la chaîne de départ lors de la suppression de caractères. Ainsi, il évite l'attribution et la copie répétées tout en ajoutant des caractères auxStringBuilder
asreplace()
.Sans parler de la génération inutile
Pattern
et desMatcher
instancesreplace()
qui ne sont jamais nécessaires pour la suppression.À la différence de
replace()
cette solution, vous pouvez supprimer plusieurs caractères en un seul coup.la source
str.replace("…", "")
instancieprivate Pattern(…)
puis sur les appels de modèle généréspublic String replaceAll(String repl)
. Les appels de fonction suivants se sont donc produits:return Pattern.compile(target.toString(), Pattern.LITERAL).matcher( this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
- voir le commentaire Sal_Vader_808. Dans l'ensemble ca 3 fois plus longtemps que ma solution lambda hip . Et ici, il est bien expliqué pourquoi ma solution hip lambda est également plus rapide: pourquoi String :: replace () de Java est-il si lent?Évaluation des principales réponses avec un repère de performance qui confirme les inquiétudes selon lesquelles la réponse actuellement choisie rend les opérations de regex coûteuses sous le capot
À ce jour, les réponses fournies se déclinent en 3 styles principaux (en ignorant la réponse JavaScript;)):
En termes de taille de code, String.replace est clairement le plus laconique. L'implémentation Java simple est légèrement plus petite et plus propre (à mon humble avis) que la Lambda (ne vous méprenez pas - j'utilise souvent Lambdas là où elles sont appropriées)
La vitesse d'exécution était, dans l'ordre du plus rapide au plus lent: implémentation Java simple, Lambda puis String.replace () (qui invoque l'expression régulière).
De loin, l'implémentation la plus rapide a été l'implémentation Java simple, réglée de manière à préallouer le tampon StringBuilder à la longueur de résultat maximale possible, puis à simplement ajouter des caractères au tampon qui ne se trouvent pas dans la chaîne "caractères à supprimer". Cela évite toute réallocation qui se produirait pour des chaînes de plus de 16 caractères (l'allocation par défaut pour StringBuilder) et cela évite le hit de performance "slide left" de supprimer des caractères d'une copie de la chaîne qui se produit est l'implémentation Lambda.
Le code ci-dessous exécute un test de référence simple, exécutant chaque implémentation 1 000 000 fois et enregistre le temps écoulé.
Les résultats exacts varient à chaque exécution, mais l'ordre des performances ne change jamais:
L'implémentation Lambda (telle que copiée à partir de la réponse de Kaplan) peut être plus lente car elle effectue un "décalage à gauche d'un" de tous les caractères à droite du caractère supprimé. Cela empirerait évidemment pour les chaînes plus longues avec beaucoup de caractères à supprimer. Il peut également y avoir des frais généraux dans l'implémentation de Lambda elle-même.
L'implémentation String.replace utilise regex et effectue une "compilation" regex à chaque appel. Une optimisation de ceci serait d'utiliser directement l'expression régulière et de mettre en cache le modèle compilé pour éviter le coût de le compiler à chaque fois.
la source
fromString.replace("X", "").replace("Y", "").replace("Z", "");
aurait besoin. Nous obtenons maintenant le bon timing: Début simple Time: 759 | Début lambda Heure: 1092 | Démarrer deleteCharsLambda () Heure: 1420 | Début de remplacement corrigé Heure: 4636Vous devrez mettre les caractères à supprimer entre crochets pendant le temps de remplacement. L'exemple de code sera le suivant:
la source
Vous pouvez utiliser
str = str.replace("X", "");
comme mentionné précédemment et tout ira bien. Car votre information''
n'est pas un caractère vide (ou valide) mais l''\0'
est.Vous pouvez donc utiliser à la
str = str.replace('X', '\0');
place.la source