Comment remplacer la casse littérale de sous-chaînes dans Java
À l'aide de la méthode replace(CharSequence target, CharSequence replacement)
en Chaîne, comment puis-je faire la cible de la casse?
Par exemple, la façon dont il fonctionne à l'heure actuelle:
String target = "FooBar";
target.replace("Foo", "") //would return "Bar"
String target = "fooBar";
target.replace("Foo", "") //would return "fooBar"
Comment puis-je faire remplacer (ou si il y a une méthode plus appropriée) est insensible à la casse, de sorte que les deux exemples de retour "Bar"?
Vous devez vous connecter pour publier un commentaire.
De sortie:
Il vaut la peine de mentionner que
replaceAll
traite le premier argument est une expression régulière pattern, ce qui peut provoquer des résultats inattendus. Pour résoudre ce problème, utilisez égalementSchéma.citation
comme suggéré dans les commentaires.target.replaceAll("(?i)"+Pattern.quote("foo"), "");
replaceAll
etreplaceFirst
Pas élégant, peut-être que d'autres approches, mais il est assez solide et facile à suivre, esp. pour les personnes plus récente de Java. Une chose qui me met sur la classe String est ceci: Il a été autour pendant un temps très long et, tandis qu'il prend en charge un remplacement global avec les regexp et un remplacement global avec des Chaînes de caractères (via CharSequences), cette dernière ne dispose pas d'un simple paramètre booléen: 'isCaseInsensitive'. Vraiment, vous auriez ai pensé que, tout en ajoutant qu'un petit interrupteur, toutes les difficultés que son absence entraîne pour les débutants en particulier, auraient pu être évités. Maintenant sur le JDK 7, Chaîne encore ne prend pas en charge ce petit plus!
Bien de toute façon, je vais arrêter de ronchonner. Pour tout le monde, en particulier la plus récente de Java, voici votre copier-coller et deus ex machina. Comme je l'ai dit, pas élégant, et pas de victoire vous toute nappe de codage des prix, mais il fonctionne et qui est fiable. Tout commentaire, n'hésitez pas à contribuer. (Oui, je sais, StringBuffer est probablement un meilleur choix de gérer les deux chaîne de caractères mutation lignes, mais il est assez facile de permuter les techniques.)
Si vous ne se soucient pas le cas, alors vous peut-être qu'il n'a pas d'importance si elle retourne tous les upcase:
Les expressions régulières sont assez complexes à gérer en raison du fait que certains caractères sont réservés: par exemple,
"foo.bar".replaceAll(".")
produit une chaîne vide, parce que la dot signifie "n'importe quoi" Si vous souhaitez remplacer uniquement le point doit être indiqué comme paramètre"\\."
.Une solution plus simple est d'utiliser StringBuilder objets pour rechercher et remplacer du texte. Il faut être deux: un qui contient le texte dans la version en minuscules tandis que la seconde contient la version originale. La recherche est effectuée sur les minuscules matières et de l'index détectées seront également remplacer le texte original.
Pour les caractères non Unicode:
J'aime smas's réponse qui utilise
replaceAll
avec une expression régulière. Si vous allez faire la même chose remplacement de nombreuses fois, il est logique de pré-compiler l'expression régulière une fois:org.apache.commons.lang3.StringUtils:
public static String replaceIgnoreCase(String texte,
Chaîne searchString,
Chaîne de remplacement)
Cas insensiblement remplace toutes les occurrences d'une chaîne dans une autre Chaîne.
Il suffit de faire simple sans tiers des bibliothèques: