Come usare il metodo `string.startsWith ()` ignorando il caso?


115

Voglio usare il string.startsWith()metodo ma ignorando il caso.

Supponiamo che io abbia String"Session" e lo uso startsWithsu "sEsSi", quindi dovrebbe tornare true.

Come posso raggiungere questo obiettivo?


5
Non c'era motivo di chiudere questa domanda. Ad ogni modo, la soluzione migliore è quella di utilizzare il string.regionMatches(true, 0, prefix, 0, prefix.length());che non incorre nel costo di "normalizzare" entrambe le stringhe.
isapir

@AlexanderAbakumov Bene per me. La risposta corretta è pubblicata nel mio commento sopra. È molto più efficiente che cambiare il caso delle stringhe. Sarebbe bene aggiornarlo a una risposta piuttosto che a un commento.
isapir

Risposte:


98

Usa toUpperCase()o toLowerCase()per standardizzare la tua stringa prima di testarla.


8
Il grosso problema qui è la performance. Per le stringhe piccole nessun problema, ma se ne hai una grande ... voglio dire ... farai davvero un toUpperCase in una stringa da 1mb solo per confrontare 4-10 caratteri iniziali?
Dyorgio

4
Canticchia anche se non riesco a capire perché vorrei confrontare la parte iniziale di una stringa da 1 MB, quindi se mi interessano solo 4-10 caratteri iniziali, uso la sottostringa e poi normalizzo e fatto ...
Nemesis

3
Questa risposta (e tutte le altre risposte qui trovate) sono sbagliate. Se guardi l'implementazione di String.equalsIgnoreCase()te, scoprirai che devi confrontare entrambe le versioni minuscole e maiuscole delle stringhe prima di poter tornare definitivamente false. Vedi stackoverflow.com/a/38947571/14731 per una risposta alternativa.
Gili

10
Questa risposta non è vera perché toLowerCase () utilizza Locale.getDefault () internamente per modificare i caratteri e ciò potrebbe portare a falsi negativi. Supponiamo che tu voglia confrontare "İstanbul" con "istanbul". In turco "İ" l'equivalente minuscolo è "ı". Quindi, quando provo a farlo "İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())(in un ambiente Locale.Turkish), mi darà false.
Mustafa Berkay Mutlu

1
@Nemesis, questa risposta è sbagliata, averla come risposta accettata potrebbe essere fuorviante per molte persone. Per favore, modifichi la tua risposta e il link alla risposta di Rohit Jain.
Moha l'onnipotente cammello

88

Un'opzione è convertire entrambi in lettere minuscole o maiuscole:

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

Questo è sbagliato. Vedi: https://stackoverflow.com/a/15518878/14731


Un'altra opzione è usare il String#regionMatches()metodo, che accetta un argomento booleano che indica se eseguire o meno la corrispondenza con distinzione tra maiuscole e minuscole. Puoi usarlo in questo modo:

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

Controlla se la regione di needleda indice 0a lunghezza 5è presente a haystackpartire da indice 0fino a lunghezza 5oppure no. Il primo argomento è true, significa che eseguirà la corrispondenza senza distinzione tra maiuscole e minuscole.


E se solo sei un grande fan di Regex , puoi fare qualcosa del genere:

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

(?i) il flag incorporato serve per ignorare la corrispondenza tra maiuscole e minuscole.


1
In realtà, supponiamo che ci sia una tabella che contiene più di 1 lakh voci, e io uso un ciclo for su una particolare colonna per analizzare tutte quelle voci e in questo, provo a usare questa opzione minuscola sopra per cercare una voce che inizia con un modello particolare . Quindi, questo sta causando un problema di prestazioni. Se non viene trovata alcuna corrispondenza, internamente analizzerà tutte le voci, il che richiederà molto tempo, poiché contemporaneamente viene convertito anche in minuscolo. Quindi esiste un'altra opzione per risolvere il problema delle prestazioni?
Sheetal Bhatewara

@Rohit Jain, in realtà questo: System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase()));non è una soluzione valida. Puoi provare questo: System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase()));con gli argomenti vm -Duser.country=TR -Duser.language=tr In questo esempio il Iè maiuscoloi
DPM

3
myString.toLowerCase().startsWith(starting.toLowerCase());

2

prova questo,

String session = "Session";
if(session.toLowerCase().startsWith("sEsSi".toLowerCase()))

2

So di essere in ritardo, ma per quanto riguarda l'utilizzo di StringUtils.startsWithIgnoreCase () da Apache Commons Lang 3?

Esempio :

StringUtils.startsWithIgnoreCase(string, "start");

Basta aggiungere la seguente dipendenza al tuo file pom.xml (ipotizzando che tu usi Maven):

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
</dependency>

0

Puoi usare someString.toUpperCase().startsWith(someOtherString.toUpperCase())


-1

Puoi sempre farlo

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

-1

l'uso inizia con e toLowerCase insieme

come questo

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.