Como executo comparação de strings sem distinção entre maiúsculas e minúsculas em JavaScript?
javascript
string
flybywire
fonte
fonte
.localeCompare()
método javascript recém-adicionado . Suportado apenas por navegadores modernos no momento da gravação (IE11 +). consulte developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…"A".localeCompare( "a" );
retorna1
no Chrome 48 Console."a"
vem antes"A"
quando classificado. Como"a"
vem antes"b"
. Se esse comportamento não for desejado, pode-se querer.toLowerCase()
cada letra / sequência. ie"A".toLowerCase().localeCompare( "a".toLowerCase() )
consulte developer.mozilla.org/en/docs/Web/JavaScript/Reference/…===
verificará a igualdade, mas não será bom o suficiente para classificar / ordenar seqüências de caracteres (consulte a pergunta à qual originalmente vinculei).Respostas:
A maneira mais simples de fazer isso (se você não estiver preocupado com caracteres Unicode especiais) é chamar
toUpperCase
:fonte
if you're not worried about special Unicode characters
.toUpperCase
maistoLowerCase
?EDIT : Esta resposta foi originalmente adicionada há 9 anos. Hoje você deve usar
localeCompare
com asensitivity: 'accent'
opção:O
{ sensitivity: 'accent' }
comando dizlocaleCompare()
para tratar duas variantes da mesma letra base da mesma, a menos que tenham sotaques diferentes (como no terceiro exemplo) acima.Como alternativa, você pode usar
{ sensitivity: 'base' }
, que trata dois caracteres como equivalente, desde que o caractere base seja o mesmo (portanto,A
seria tratado como equivalente aá
).Observe que o terceiro parâmetro de
localeCompare
não é suportado no IE10 ou em navegadores móveis inferiores ou em certos dispositivos (consulte a tabela de compatibilidade na página acima), portanto, se você precisar oferecer suporte a esses navegadores, precisará de algum tipo de fallback:Resposta original
A melhor maneira de fazer uma comparação sem distinção entre maiúsculas e minúsculas no JavaScript é usar o
match()
método RegExp com oi
sinalizador.Pesquisa que não diferencia maiúsculas de minúsculas
Quando as duas strings comparadas são variáveis (não constantes), é um pouco mais complicado, porque você precisa gerar um RegExp a partir da string, mas passar a string para o construtor RegExp pode resultar em correspondências incorretas ou falhas na correspondência, se a string possuir regex especial caracteres nele.
Se você se preocupa com a internacionalização, não use
toLowerCase()
outoUpperCase()
não forneça comparações precisas que não diferenciam maiúsculas de minúsculas em todos os idiomas.http://www.i18nguy.com/unicode/turkish-i18n.html
fonte
'a'.localeCompare('A')
e como o op que eu estou procurando caso insensitive string compare.localeCompare
versão requer que o motor de JavaScript apoiar a API ECMAScript® Internacionalização , que é não obrigados a fazer. Portanto, antes de confiar nisso, verifique se ele funciona no ambiente que você está usando. Por exemplo:const compareInsensitive = "x".localeCompare("X", undefined, {sensitivity: "base"}) === 0 ? (a, b) => a.localeCompare(b, undefined, {sensitivity: "base"}) : (a, b) => a.toLowerCase().localeCompare(b.toLowerCase());
ou algo assim.Como dito em comentários recentes,
string::localeCompare
suporta comparações sem distinção entre maiúsculas e minúsculas (entre outras coisas poderosas).Aqui está um exemplo simples
E uma função genérica que você poderia usar
Observe que, em vez de
undefined
você provavelmente deve inserir o código do idioma específico com o qual está trabalhando. Isso é importante, conforme indicado nos documentos MDNOpções de sensibilidade
Suporte do navegador
No momento da postagem, o UC Browser para Android e Opera Mini não suporta parâmetros de localidade e opções . Verifique https://caniuse.com/#search=localeCompare para obter informações atualizadas.
fonte
Com a ajuda da expressão regular também podemos alcançar.
/i
é para ignorar maiúsculas e minúsculas. Se não for necessário, podemos ignorar e testar a correspondência NÃO sensível a maiúsculas e minúsculas, comofonte
keyWORD
irá resultar em uma correspondência positiva. Mas a stringthis is a keyword yo
oukeywords
também resultará em uma correspondência positiva. Esteja ciente de que :-)/^keyword$/.test(source)
, mas 1) sekeyword
não for uma constante, você precisaria fazernew RegExp('^' + x + '$').test(source)
e 2) recorrer a um regexp para testar algo tão simples quanto a igualdade de string sem distinção entre maiúsculas e minúsculas não é muito eficiente.Lembre-se de que a caixa é uma operação específica do código do idioma. Dependendo do cenário, convém levar isso em consideração. Por exemplo, se você estiver comparando nomes de duas pessoas, considere o código de idioma, mas se estiver comparando valores gerados por máquina, como UUID, talvez não. É por isso que uso a seguinte função na minha biblioteca de utilitários (observe que a verificação de tipo não está incluída por motivos de desempenho).
fonte
compareStrings("", "")
daráfalse
a despeito do fato das cordas são iguais.true
para mim. Talvez seja um erro no seu navegador?Recentemente, criei uma micro biblioteca que fornece auxiliares de string que não diferenciam maiúsculas de minúsculas: https://github.com/nickuraltsev/ignore-case . (Ele usa
toUpperCase
internamente.)fonte
se você está preocupado com a direção da desigualdade (talvez queira classificar uma lista), é necessário fazer a conversão de maiúsculas e minúsculas e, como existem mais caracteres minúsculos em unicode do que maiúsculas em LowerCase, provavelmente é a melhor conversão a ser usada.
O Javascript parece usar o código de idioma "C" para comparações de strings, portanto a ordem resultante será feia se as strings contiverem letras que não sejam ASCII. não há muito que possa ser feito sobre isso sem fazer uma inspeção muito mais detalhada das strings.
fonte
Suponha que desejamos encontrar a variável string
needle
na variável stringhaystack
. Existem três dicas:string.toUpperCase
estring.toLowerCase
. Use uma expressão regular que ignore maiúsculas e minúsculas. Por exemplo,var needleRegExp = new RegExp(needle, "i");
seguido porneedleRegExp.test(haystack)
.needle
. Cuidado paraneedle
não conter caracteres especiais de expressão regular . Fuja deles usandoneedle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
.needle
ehaystack
, apenas ignorando o caso, adicione"^"
-o no início e"$"
no final do construtor de expressões regulares.Levando em consideração os pontos (1) e (2), um exemplo seria:
fonte
new RegExp(...)
parte na linha 3 com o seguinte:new RegExp("^" + needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") + "$", "i");
. Isso garante que não haja outros caracteres antes ou depois da sua sequência de pesquisaneedle
.Existem duas maneiras de comparação sem distinção entre maiúsculas e minúsculas:
===
). Como o operador rigoroso trata os operandos lê o material em: http://www.thesstech.com/javascript/relational-logical-operatorsUse o método de string "search" para pesquisa que não diferencia maiúsculas de minúsculas. Leia sobre a pesquisa e outros métodos de string em: http://www.thesstech.com/pattern-matching-using-string-methods
fonte
Muitas respostas aqui, mas eu gostaria de adicionar uma solução baseada na extensão da biblioteca String:
Dessa forma, você pode usá-lo como em Java!
Exemplo:
A saída será:
fonte
Use RegEx para correspondência ou comparação de cadeias de caracteres.
Em JavaScript, você pode usar
match()
para comparação de cadeias, não se esqueça de colocari
no RegEx.Exemplo:
fonte
matchString.match(/^test$/i)
.matchString.match(/x/i)
funcionaria? Se não, o que funcionaria?fonte
Se ambas as seqüências de caracteres tiverem o mesmo código de idioma conhecido, convém usar
Intl.Collator
objetos como este:Obviamente, convém armazenar em cache o
Collator
para obter melhor eficiência.As vantagens dessa abordagem é que ela deve ser muito mais rápida do que usar o RegExps e se baseia em um conjunto extremamente personalizável (veja descrição
locales
eoptions
parâmetros do construtor no artigo acima) de separadores prontos para uso.fonte
accent
, que a mantém sem distinção entre maiúsculas e minúsculas, mas trataa
eá
como caracteres separados. Portanto,base
ouaccent
ambos podem ser apropriados, dependendo das necessidades exatas.Eu escrevi uma extensão. muito trivial
fonte
String#isEqual
ouObject#isEqual
nativamente todas as suas páginas se comportam de maneira diferente e podem fazer coisas estranhas se a especificação não corresponder exatamente à sua.Até esta pergunta já respondeu. Eu tenho uma abordagem diferente para usar RegExp e corresponder para ignorar maiúsculas de minúsculas. Por favor, veja o meu link https://jsfiddle.net/marchdave/7v8bd7dq/27/
fonte
Que tal NÃO lançar exceções e NÃO usar regex lento?
O snippet acima pressupõe que você não deseja corresponder se uma sequência for nula ou indefinida.
Se você deseja corresponder nulo / indefinido, então:
Se, por algum motivo, você se importar com undefined vs null:
fonte
str1 == str2 || ...
Como nenhuma resposta forneceu claramente um trecho de código simples para uso
RegExp
, eis a minha tentativa:Tem várias vantagens:
undefined
por exemplo, trava uma expressão comostr1.toUpperCase()
).RegExp
string.fonte
Esta é uma versão melhorada de esta resposta .
Usos e testes:
Mostrar snippet de código
fonte
Converta ambos em menor (apenas uma vez por motivos de desempenho) e compare-os com o operador ternário em uma única linha:
fonte
Se você sabe que está lidando com
ascii
texto, basta usar uma comparação de deslocamento de caracteres em maiúsculas / minúsculas.Apenas certifique-se de que a string "perfeita" (a que você deseja corresponder) esteja em minúscula:
fonte
Eu gosto dessa variação rápida de taquigrafia -
Rápido no processamento e faz o que se destina.
fonte
Essa
javascript
biblioteca parece fornecer muitas operações de string. É muito conveniente usarComo instalar
Importar
String de Ignorecase Compare
fonte