Não havia razão para encerrar esta questão. De qualquer forma, a melhor solução é usar o string.regionMatches(true, 0, prefix, 0, prefix.length());que não acarreta o custo de "normalizar" as duas strings.
isapir
@AlexanderAbakumov Tudo bem por mim. A resposta correta está postada em meu comentário acima. É muito mais eficiente do que mudar a caixa das cordas. Seria bom atualizá-lo para uma resposta em vez de um comentário.
isapir,
Respostas:
98
Use toUpperCase()ou toLowerCase()para padronizar sua string antes de testá-la.
O grande problema aqui é o desempenho. Para strings pequenas não há problema, mas se você tiver uma grande ... quero dizer ... Você realmente fará um toUpperCase em uma string de 1mb apenas para comparar 4-10 caracteres iniciais?
Dyorgio
4
Hum, mesmo que eu não consiga ver porque eu gostaria de comparar a parte inicial de uma String de 1mb, então se apenas 4 - 10 caracteres iniciais me interessarem, eu uso substring e depois normalizo e pronto ...
Nemesis
3
Esta resposta (e todas as outras respostas encontradas aqui) estão erradas. Se você observar a implementação de String.equalsIgnoreCase(), descobrirá que precisa comparar as versões em maiúsculas e minúsculas das Strings antes de retornar de forma conclusiva false. Consulte stackoverflow.com/a/38947571/14731 para obter uma resposta alternativa.
Gili
10
Essa resposta não é verdadeira porque toLowerCase () usa Locale.getDefault () internamente para alterar os caracteres e isso pode levar a falsos negativos. Digamos que você queira comparar "Istambul" com "Istambul". Em turco "İ", o equivalente em minúsculas é "ı". Então, quando eu tento fazer isso "İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())(em um ambiente Locale.Turkish), ele me retorna falso.
Mustafa Berkay Mutlu
1
@Nemesis, essa resposta está errada, tê-la como a resposta aceita pode ser enganosa para muitas pessoas. Você poderia editar sua resposta e criar um link para a resposta de Rohit Jain.
Moha, o camelo todo-poderoso
88
Uma opção é convertê-los em letras minúsculas ou maiúsculas:
Outra opção é usar o String#regionMatches()método, que recebe um argumento booleano informando se deve ser feita correspondência com distinção entre maiúsculas e minúsculas ou não. Você pode usá-lo assim:
Ele verifica se a região needledo índice 0até o comprimento 5está presente no haystackinício do índice 0até o comprimento 5ou não. O primeiro argumento é true, significa que fará correspondência sem distinção entre maiúsculas e minúsculas.
E se você for um grande fã da Regex , você pode fazer algo assim:
Na verdade, suponha que haja uma tabela com mais de 1 lakh de entradas, e eu uso um loop for em uma coluna específica para analisar todas essas entradas e, com isso, tento usar esta opção em minúsculas acima para pesquisar uma entrada começando com um padrão específico . Portanto, isso está causando um problema de desempenho. Se nenhuma correspondência for encontrada, ele analisará internamente todas as entradas, o que levará muito tempo, pois simultaneamente também será convertido para minúsculas. Então, há alguma outra opção para resolver o problema de desempenho?
Sheetal Bhatewara
@Rohit Jain, na verdade esta: System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase()));não é uma solução adequada. Você pode tentar isto: System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase()));com argumentos vm -Duser.country=TR -Duser.language=tr Neste exemplo, o Iestá em maiúsculasi
string.regionMatches(true, 0, prefix, 0, prefix.length());
que não acarreta o custo de "normalizar" as duas strings.Respostas:
Use
toUpperCase()
outoLowerCase()
para padronizar sua string antes de testá-la.fonte
String.equalsIgnoreCase()
, descobrirá que precisa comparar as versões em maiúsculas e minúsculas das Strings antes de retornar de forma conclusivafalse
. Consulte stackoverflow.com/a/38947571/14731 para obter uma resposta alternativa."İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())
(em um ambiente Locale.Turkish), ele me retorna falso.Uma opção é convertê-los em letras minúsculas ou maiúsculas:Isto está errado. Veja: https://stackoverflow.com/a/15518878/14731Outra opção é usar o
String#regionMatches()
método, que recebe um argumento booleano informando se deve ser feita correspondência com distinção entre maiúsculas e minúsculas ou não. Você pode usá-lo assim:Ele verifica se a região
needle
do índice0
até o comprimento5
está presente nohaystack
início do índice0
até o comprimento5
ou não. O primeiro argumento étrue
, significa que fará correspondência sem distinção entre maiúsculas e minúsculas.E se você for um grande fã da Regex , você pode fazer algo assim:
(?i)
sinalizador incorporado é para ignorar correspondência de maiúsculas e minúsculas.fonte
System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase()));
não é uma solução adequada. Você pode tentar isto:System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase()));
com argumentos vm-Duser.country=TR -Duser.language=tr
Neste exemplo, oI
está em maiúsculasi
fonte
tente isso,
fonte
Eu sei que estou atrasado, mas que tal usar StringUtils.startsWithIgnoreCase () do Apache Commons Lang 3?
Exemplo:
Basta adicionar a seguinte dependência ao seu arquivo pom.xml (assumindo a hipótese de que você usa o Maven):
fonte
Você pode usar
someString.toUpperCase().startsWith(someOtherString.toUpperCase())
fonte
Você sempre pode fazer
fonte
o uso começa com e toLowerCase juntos
como isso
fonte