Como usar o método `string.startsWith ()` ignorando o caso?

115

Eu quero usar o string.startsWith()método, mas ignorando o caso.

Suponha que eu tenha String"Session" e use startsWith"sEsSi", então ele deve retornar true.

Como posso conseguir isso?

Sheetal Bhatewara
fonte
5
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.

Nêmesis
fonte
8
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:

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

Isto está errado. Veja: https://stackoverflow.com/a/15518878/14731


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:

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

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:

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

(?i) sinalizador incorporado é para ignorar correspondência de maiúsculas e minúsculas.

Rohit Jain
fonte
1
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
DPM
3
myString.toLowerCase().startsWith(starting.toLowerCase());
ágad
fonte
2

tente isso,

String session = "Session";
if(session.toLowerCase().startsWith("sEsSi".toLowerCase()))
novo usuário
fonte
2

Eu sei que estou atrasado, mas que tal usar StringUtils.startsWithIgnoreCase () do Apache Commons Lang 3?

Exemplo:

StringUtils.startsWithIgnoreCase(string, "start");

Basta adicionar a seguinte dependência ao seu arquivo pom.xml (assumindo a hipótese de que você usa o Maven):

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

Você pode usar someString.toUpperCase().startsWith(someOtherString.toUpperCase())

Prasad Kharkar
fonte
-1

Você sempre pode fazer

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

o uso começa com e toLowerCase juntos

como isso

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