Comment utiliser la méthode `string.startsWith ()` en ignorant la casse?

115

Je veux utiliser la string.startsWith()méthode mais en ignorant le cas.

Supposons que j'ai String"Session" et que j'utilise startsWithsur "sEsSi" alors il devrait revenir true.

Comment puis-je atteindre cet objectif?

Sheetal Bhatewara
la source
5
Il n'y avait aucune raison de clore cette question. Quoi qu'il en soit, la meilleure solution est d'utiliser string.regionMatches(true, 0, prefix, 0, prefix.length());ce qui n'entraîne pas le coût de "normalisation" des deux chaînes.
isapir
@AlexanderAbakumov Très bien pour moi. La bonne réponse est publiée dans mon commentaire ci-dessus. C'est beaucoup plus efficace que de changer la casse des chaînes. Ce serait bien de le mettre à niveau vers une réponse plutôt qu'un commentaire.
isapir

Réponses:

98

Utilisez toUpperCase()ou toLowerCase()pour standardiser votre chaîne avant de la tester.

Némésis
la source
8
Le gros problème ici est la performance. Pour les petites chaînes, pas de problème, mais si vous en avez une grande ... je veux dire ... Ferez-vous vraiment un toUpperCase dans une chaîne de 1 Mo juste pour comparer 4 à 10 caractères officiels?
Dyorgio
4
Hum même si je ne vois pas pourquoi je voudrais comparer la partie de départ d'une chaîne de 1 Mo, alors si seulement 4 à 10 caractères initiaux m'intéressent, j'utilise une sous-chaîne, puis je normalise et fait ...
Nemesis
3
Cette réponse (et toutes les autres réponses trouvées ici) sont fausses. Si vous regardez la mise en œuvre de String.equalsIgnoreCase()vous découvrirez que vous devez comparer les deux versions minuscules et majuscules des chaînes avant de pouvoir revenir de façon concluante false. Voir stackoverflow.com/a/38947571/14731 pour une autre réponse.
Gili
10
Cette réponse n'est pas vraie car toLowerCase () utilise Locale.getDefault () en interne pour modifier les caractères et cela peut conduire à de faux négatifs. Disons que vous voulez comparer "İstanbul" avec "istanbul". En turc, l'équivalent minuscule de «İ» est «ı». Donc, quand j'essaye de faire ça "İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())(dans un environnement Locale.Turkish), ça me donnera faux.
Mustafa Berkay Mutlu
1
@Nemesis, Cette réponse est fausse, l'avoir comme réponse acceptée pourrait être trompeuse pour beaucoup de gens. Pourriez-vous s'il vous plaît modifier votre réponse et créer un lien vers la réponse de Rohit Jain.
Moha le chameau tout-puissant
88

Une option consiste à les convertir tous les deux en minuscules ou en majuscules:

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());

C'est faux. Voir: https://stackoverflow.com/a/15518878/14731


Une autre option consiste à utiliser String#regionMatches()method, qui prend un argument booléen indiquant s'il faut faire une correspondance sensible à la casse ou non. Vous pouvez l'utiliser comme ceci:

String haystack = "Session";
String needle = "sEsSi";
System.out.println(haystack.regionMatches(true, 0, needle, 0, 5));  // true

Il vérifie si la région de l' needleindex 0à la longueur 5est présente ou non à haystackpartir de l'index 0jusqu'à la longueur 5. Le premier argument est true, signifie qu'il effectuera une correspondance insensible à la casse.


Et si seulement vous êtes un grand fan de Regex , vous pouvez faire quelque chose comme ceci:

System.out.println(haystack.matches("(?i)" + Pattern.quote(needle) + ".*"));

(?i) L'indicateur intégré sert à ignorer la correspondance de casse.

Rohit Jain
la source
1
En fait, supposons qu'il y ait une table qui contient plus de 1 entrées lakh, et j'utilise une boucle for sur une colonne particulière pour analyser toutes ces entrées et en cela, j'essaie d'utiliser cette option en minuscules ci-dessus pour rechercher une entrée commençant par un modèle particulier . Donc, cela pose un problème de performances. S'il n'y a aucune correspondance trouvée, alors en interne, il analysera toutes les entrées, ce qui prendra beaucoup de temps, car simultanément il sera également converti en minuscules. Alors, existe-t-il une autre option pour résoudre les problèmes de performances?
Sheetal Bhatewara
@Rohit Jain, en fait ceci: System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase()));n'est pas une solution appropriée. Vous pouvez essayer ceci: System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase()));avec des arguments vm -Duser.country=TR -Duser.language=tr Dans cet exemple, le Iest en majusculei
DPM
3
myString.toLowerCase().startsWith(starting.toLowerCase());
agad
la source
2

essaye ça,

String session = "Session";
if(session.toLowerCase().startsWith("sEsSi".toLowerCase()))
nouvel utilisateur
la source
2

Je sais que je suis en retard, mais qu'en est-il de l'utilisation de StringUtils.startsWithIgnoreCase () d'Apache Commons Lang 3?

Exemple :

StringUtils.startsWithIgnoreCase(string, "start");

Ajoutez simplement la dépendance suivante à votre fichier pom.xml (en prenant l'hypothèse que vous utilisez Maven):

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
</dependency>
Sébastien Vandamme
la source
0

Vous pouvez utiliser someString.toUpperCase().startsWith(someOtherString.toUpperCase())

Prasad Kharkar
la source
-1

Tu peux toujours faire

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
RamonBoza
la source
-1

l'utilisation commence par et toLowerCase ensemble

comme ça

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
rachit
la source