¿Cómo usar el método `string.startsWith ()` ignorando el caso?

115

Quiero usar el string.startsWith()método pero ignorando el caso.

Supongamos que tengo String"Sesión" y uso startsWithen "sEsSi", entonces debería regresar true.

¿Cómo puedo conseguir esto?

Sheetal Bhatewara
fuente
5
No había ninguna razón para cerrar esta pregunta. De todos modos, la mejor solución es usar la string.regionMatches(true, 0, prefix, 0, prefix.length());que no incurra en el costo de "normalizar" ambas cadenas.
isapir
@AlexanderAbakumov Bien por mí. La respuesta correcta está publicada en mi comentario anterior. Es mucho más eficiente que cambiar el caso de las cadenas. Sería bueno actualizarlo a una respuesta en lugar de un comentario.
isapir

Respuestas:

98

Utilice toUpperCase()o toLowerCase()para estandarizar su cadena antes de probarla.

Justicia
fuente
8
El gran problema aquí es el rendimiento. Para cadenas pequeñas no hay problema, pero si tienes una grande ... quiero decir ... ¿Realmente harás un toUpperCase en una cadena de 1mb solo para comparar 4-10 caracteres iniciales?
Dyorgio
4
Hum, incluso si no puedo ver por qué me gustaría comparar la parte inicial de una cadena de 1mb, entonces si solo me interesan 4 - 10 caracteres iniciales, uso la subcadena y luego normalizo y listo ...
Nemesis
3
Esta respuesta (y todas las demás respuestas que se encuentran aquí) son incorrectas. Si nos fijamos en la implementación de String.equalsIgnoreCase()usted descubrirá que es necesario comparar ambos versión en minúsculas y mayúsculas de las cuerdas antes de que pueda volver concluyente false. Consulte stackoverflow.com/a/38947571/14731 para obtener una respuesta alternativa.
Gili
10
Esta respuesta no es cierta porque toLowerCase () usa Locale.getDefault () internamente para cambiar los caracteres y eso podría conducir a falsos negativos. Digamos que quiere comparar "Estambul" con "Estambul". En turco, el equivalente en minúsculas de "İ" es "ı". Entonces, cuando trato de hacer eso "İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())(en un entorno Locale.Turkish), me dará falso.
Mustafa Berkay Mutlu
1
@Nemesis, esta respuesta es incorrecta, tenerla como la respuesta aceptada podría ser engañoso para mucha gente. ¿Podría editar su respuesta y vincularla a la respuesta de Rohit Jain?
Moha el camello todopoderoso
88

Una opción es convertir ambos a minúsculas o mayúsculas:

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

Esto está mal. Ver: https://stackoverflow.com/a/15518878/14731


Otra opción es usar el String#regionMatches()método, que toma un argumento booleano que indica si se deben hacer coincidencias sensibles a mayúsculas y minúsculas o no. Puedes usarlo así:

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

Comprueba si la región needledesde el índice 0hasta la longitud 5está presente al haystackcomenzar desde el índice 0hasta la longitud 5o no. El primer argumento es true, significa que hará una coincidencia que no distinga entre mayúsculas y minúsculas.


Y si solo eres un gran fan de Regex , puedes hacer algo como esto:

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

(?i) La bandera incrustada es para ignorar la coincidencia de mayúsculas y minúsculas.

Rohit Jain
fuente
1
En realidad, suponga que hay una tabla que tiene más de 1 lakh de entradas, y uso un bucle for en una columna en particular para analizar todas esas entradas y, en ese caso, trato de usar esta opción en minúsculas anterior para buscar una entrada que comience con un patrón particular . Entonces, esto está causando un problema de rendimiento. Si no se encuentra ninguna coincidencia, internamente analizará todas las entradas, lo que llevará mucho tiempo, ya que simultáneamente también se convertirá en minúsculas. Entonces, ¿hay alguna otra opción para resolver el problema de rendimiento?
Sheetal Bhatewara
@Rohit Jain, en realidad esto: System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase()));no es una solución adecuada. Puede probar esto: System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase()));con argumentos vm -Duser.country=TR -Duser.language=tr En este ejemplo, Iestá en mayúsculasi
DPM
3
myString.toLowerCase().startsWith(starting.toLowerCase());
agad
fuente
2

prueba esto,

String session = "Session";
if(session.toLowerCase().startsWith("sEsSi".toLowerCase()))
Nuevo Usuario
fuente
1

Sé que llego tarde, pero ¿qué pasa con el uso de StringUtils.startsWithIgnoreCase () de Apache Commons Lang 3?

Ejemplo:

StringUtils.startsWithIgnoreCase(string, "start");

Simplemente agregue la siguiente dependencia a su archivo pom.xml (tomando la hipótesis de que usa Maven):

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

Puedes usar someString.toUpperCase().startsWith(someOtherString.toUpperCase())

Prasad Kharkar
fuente
-1

Siempre puedes hacer

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

el uso comienza con y toLowerCase juntos

Me gusta esto

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