3
votes

Remplacement de plusieurs chaînes insensibles à la casse

Je souhaite remplacer plusieurs chaînes insensibles à la casse d'une chaîne.

J'aurais pu utiliser: org.apache.commons.lang.StringUtils.replaceEach (text, searchList, replacementList)

mais fonctionne pour les chaînes sensibles à la casse.

méthode similaire qui fonctionne pour les chaînes insensibles à la casse?

My nick name is Abhi

Résultat:

My name is Abhishek

Attendu:

static String[] old = {"ABHISHEK","Name"};
static String[] nw = {"Abhi","nick name"};
static String s="My name is Abhishek";
System.out.println(StringUtils.replaceEach(s, old, nw));


1 commentaires

"Existe-t-il une méthode similaire qui fonctionne pour les chaînes insensibles à la casse?" Nan. Vous devrez en écrire un vous-même.


3 Réponses :


5
votes

Vous pouvez essayer d'utiliser regex pour l'archiver

Exemple

XXX

Résultat:

Après remplacement: Abhiskek Abhiskek Abhiskek Abhiskek

EDIT


str.replaceAll("(?i)" + Pattern.quote(old[i]), nw[i]);

Résultat:

Mon surnom est Abhi

Idéal de base: Regex ignore la casse et replaceAll ()

À partir du commentaire @flown (Merci), vous devez utiliser p >

String[] old = {"ABHISHEK","Name"};
String[] nw = {"Abhi","nick name"};
String s="My name is Abhishek";
//make sure old and nw have same size please
for(int i =0; i < old.length; i++) {
    s = s.replaceAll("(?i)"+old[i], nw[i]);
}
System.out.println(s);

Parce que regex traite certains caractères spéciaux avec une signification différente, ex: . comme n'importe quel caractère unique

Donc, utiliser le Pattern.quote fera cela.


4 commentaires

Je souhaite remplacer plusieurs chaînes en une seule fois. Je passe le tableau String.


@Ivar vous pouvez utiliser str.replaceAll ("(? I)" + Pattern.quote (old [i]), nw [i])


@DangNguyen: Avez-vous essayé d'exécuter ce programme? Cela me donne Sortie: Mon surnom est Abhishek


Désolé mon mauvais. oui ça a marché. Existe-t-il un moyen de battre en java 8 en utilisant des flux pour obtenir la même chose?



0
votes

en JAVA, les chaînes sont sensibles à la casse; si vous souhaitez les utiliser insensibles, vous devez utiliser des méthodes appropriées. par exemple equals () est vraiment différent avec equalsIgnoreCase () .

Vous pouvez utiliser:

compareToIgnoreCase()

Ou :

 String.equalsIgnoreCase()

et si ces méthodes renvoient des données appropriées, vous pouvez les utiliser pour les remplacer par la chaîne de votre choix.


0 commentaires

3
votes

Puisque vous utilisez déjà StringUtils , StringUtils.replaceIgnoreCase est un bon candidat. Il convient de mentionner que la version 3.5+ est requise.

s = replaceIgnoreCase(s, old, nw);

Remplace insensible à la casse toutes les occurrences d'une chaîne dans une autre Chaîne.

Une référence nulle passée à cette méthode est un no-op.

public static String replaceIgnoreCase(final String s, final String searchList[], final String replacementList[]) {
    if (searchList.length != replacementList.length)
        throw new IllegalArgumentException("Search list and replacement list sizes do not match");

    String replaced = s;
    for (int i = 0; i < searchList.length; i++) {
        replaced = StringUtils.replaceIgnoreCase(s, searchList[i], replacementList[i]);
    }

    return replaced;
}

Dans votre cas:

My nick name is Abhi

Sortie:

String[] old = {"ABHISHEK", "Name"};
String[] nw = {"Abhi", "nick name"};
String s = "My name is Abhishek";

for (int i = 0; i < old.length; i++) {
    s = StringUtils.replaceIgnoreCase(s, old[i], nw[i]);
}

System.out.println(s);

Vous pouvez même créer une méthode d'assistance si vous comptez l'utiliser fréquemment:

 StringUtils.replaceIgnoreCase(null, *, *)        = null
 StringUtils.replaceIgnoreCase("", *, *)          = ""
 StringUtils.replaceIgnoreCase("any", null, *)    = "any"
 StringUtils.replaceIgnoreCase("any", *, null)    = "any"
 StringUtils.replaceIgnoreCase("any", "", *)      = "any"
 StringUtils.replaceIgnoreCase("aba", "a", null)  = "aba"
 StringUtils.replaceIgnoreCase("abA", "A", "")    = "b"
 StringUtils.replaceIgnoreCase("aba", "A", "z")   = "zbz"

Et utilisez-le comme vous utiliseriez un appel à la bibliothèque:

public static String replaceIgnoreCase(String text,
                                       String searchString,
                                       String replacement)


1 commentaires

La méthode replaceIgnoreCase (String, String, String) n'est pas définie pour le type StringUtils. J'utilise commons-lang-2.6.jar