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.
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:
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í:
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:
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
string.regionMatches(true, 0, prefix, 0, prefix.length());
que no incurra en el costo de "normalizar" ambas cadenas.Respuestas:
Utilice
toUpperCase()
otoLowerCase()
para estandarizar su cadena antes de probarla.fuente
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 concluyentefalse
. Consulte stackoverflow.com/a/38947571/14731 para obtener una respuesta alternativa."İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())
(en un entorno Locale.Turkish), me dará falso.Una opción es convertir ambos a minúsculas o mayúsculas:Esto está mal. Ver: https://stackoverflow.com/a/15518878/14731Otra 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í:Comprueba si la región
needle
desde el índice0
hasta la longitud5
está presente alhaystack
comenzar desde el índice0
hasta la longitud5
o no. El primer argumento estrue
, 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:
(?i)
La bandera incrustada es para ignorar la coincidencia de mayúsculas y minúsculas.fuente
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,I
está en mayúsculasi
fuente
prueba esto,
fuente
Sé que llego tarde, pero ¿qué pasa con el uso de StringUtils.startsWithIgnoreCase () de Apache Commons Lang 3?
Ejemplo:
Simplemente agregue la siguiente dependencia a su archivo pom.xml (tomando la hipótesis de que usa Maven):
fuente
Puedes usar
someString.toUpperCase().startsWith(someOtherString.toUpperCase())
fuente
Siempre puedes hacer
fuente
el uso comienza con y toLowerCase juntos
Me gusta esto
fuente