93 votes

indexOf Sensible à la casse ?

La méthode indexOf(String) est-elle sensible à la casse ? Si oui, existe-t-il une version insensible à la casse ?

3 votes

Non pas que je sois un grand fan des performances ou quoi que ce soit d'autre (en fait, je considère que l'optimisation des performances est un mal), mais le .toUpperCase copie votre chaîne de caractères à chaque fois que vous l'appelez, donc si vous faites cela dans une boucle, essayez de déplacer le .toUpperCase hors de la boucle si possible.

80voto

Joey Points 148544

El indexOf() sont toutes sensibles à la casse. Vous pouvez les rendre insensibles à la casse en convertissant au préalable vos chaînes de caractères en majuscules/minuscules (de manière approximative, mais qui fonctionne dans de nombreux cas) :

s1 = s1.toLowerCase(Locale.US);
s2 = s2.toLowerCase(Locale.US);
s1.indexOf(s2);

6 votes

Attention aux problèmes d'internationalisation (par exemple, le I turc) lorsque vous utilisez toUpperCase. Une solution plus appropriée est d'utiliser str.toUpperCase(Locale.US).indexOf(...) ;

2 votes

Je suis certain que la conversion en casse puis la comparaison n'est pas tout à fait correcte selon les règles de comparaison d'Unicode. Cela fonctionne pour certaines choses (notamment le pliage de la casse, qui n'est généralement utilisé que dans des contextes d'analyse syntaxique), mais pour le langage naturel, il peut y avoir des cas particuliers où deux chaînes de caractères qui devraient se comparer de manière égale ne le font pas, que ce soit en majuscules ou en minuscules. Je ne peux cependant pas trouver d'exemples tout de suite.

8 votes

Ne fonctionne pas. Certains caractères internationaux bizarres sont convertis en plusieurs caractères lorsqu'ils sont convertis en minuscules ou en majuscules. Par exemple : "ß".toUpperCase().equals("SS")

44voto

dfa Points 54490

La méthode indexOf(String) est-elle sensible à la casse ?

Oui, c'est sensible à la casse :

@Test
public void indexOfIsCaseSensitive() {
    assertTrue("Hello World!".indexOf("Hello") != -1);
    assertTrue("Hello World!".indexOf("hello") == -1);
}

Si oui, existe-t-il une version insensible à la casse ?

Non, il n'y en a pas. Vous pouvez convertir les deux chaînes en minuscules avant d'appeler indexOf :

@Test
public void caseInsensitiveIndexOf() {
    assertTrue("Hello World!".toLowerCase().indexOf("Hello".toLowerCase()) != -1);
    assertTrue("Hello World!".toLowerCase().indexOf("hello".toLowerCase()) != -1);
}

9 votes

Oh s'il vous plaît n'oubliez pas d'utiliser la conversion invariante de culture avec Locale.US, nous avons eu assez de problèmes avec des applications java fonctionnant sous la locale turque.

0 votes

@idursun - Le fait de forcer l'utilisation de la locale américaine ne résout pas le problème, car cela ne fonctionne toujours pas pour les chaînes de caractères qui contiennent effectivement les caractères qui posent problème au départ (par exemple "".toLowerCase(Locale.US).indexOf("I".toLowerCase(Locale.US‌​)) devrait retourner 0 parce que la première chaîne est une minuscule turque "I" et doit donc être comparée comme égale à la majuscule "I" dans le second, mais renvoie -1 car ce dernier est converti en "i" à la place).

23voto

deepika Points 11

Il existe une méthode pour ignorer les cas dans la classe StringUtils de la bibliothèque Apache Commons Lang.

indexOfIgnoreCase(CharSequence str, CharSequence searchStr)

0 votes

Cela devrait être une réponse acceptée, car la réponse actuelle ne fonctionne pas pour certaines chaînes non ascii qui contiennent des caractères de contrôle unicode. Par exemple, cela fonctionne pour les textes écrits en turc. Derrière la scène, Apache utilise regionMatches, et cela fonctionne.

17voto

jjnguy Points 62123

Oui, indexOf est sensible à la casse.

La meilleure façon de faire de l'insensibilité de cas que j'ai trouvé est :

String original;
int idx = original.toLowerCase().indexOf(someStr.toLowerCase());

Cela permet de ne pas tenir compte de la casse indexOf() .

5 votes

Non. Ne fais jamais ça. La raison en est que, original.toLowerCase().length() n'est pas toujours égal à original.length() . Le résultat idx n'est pas en mesure de se reconnecter correctement à original .

11voto

Nick Lewis Points 3143

Oui, il est sensible à la casse. Vous pouvez faire une recherche insensible à la casse indexOf en convertissant votre String et le paramètre String en majuscules avant la recherche.

String str = "Hello world";
String search = "hello";
str.toUpperCase().indexOf(search.toUpperCase());

Notez que toUpperCase peut ne pas fonctionner dans certaines circonstances. Par exemple, ceci :

String str = "Feldbergstraße 23, Mainz";
String find = "mainz";
int idxU = str.toUpperCase().indexOf (find.toUpperCase ());
int idxL = str.toLowerCase().indexOf (find.toLowerCase ());

idxU sera 20, ce qui est faux ! idxL sera 19, ce qui est correct. La cause du problème est que toUpperCase() convertit le caractère "ß" en DEUX caractères, "SS", ce qui déséquilibre l'index.

Par conséquent, utilisez toujours toLowerCase().

1 votes

S'en tenir aux minuscules n'aide pas : si vous changez find a "STRASSE" il ne le trouve pas du tout dans la variante en minuscules, mais le trouve correctement dans la version en majuscules.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X