HOWTO · JavaScript

Como comparar strings sem diferenciar maiúsculas e minúsculas em JavaScript

Veja como comparar strings ignorando diferenças entre maiúsculas e minúsculas em JavaScript, com conversão de caixa, localeCompare() e expressões regulares.

Nesta página

A igualdade entre strings em JavaScript diferencia maiúsculas de minúsculas: "Hello" === "hello" resulta em false. Para uma comparação simples que ignore essa diferença, converta as duas strings com toLowerCase() e compare os resultados. Use localeCompare() quando as regras de comparação precisarem levar um idioma em conta; recorra a uma expressão regular quando a tarefa for encontrar um padrão, em vez de comparar duas strings completas.

Converta as duas strings para a mesma caixa em comparações simples

Antes de usar a igualdade estrita, converta os dois valores da mesma maneira. toLowerCase() é uma opção comum; o mesmo padrão também funciona com toUpperCase(), mas nenhum dos métodos é sempre preferível. A conversão de caixa é prática para identificadores comuns e dados informados pelo usuário, mas não implementa uma equivalência universal de maiúsculas e minúsculas para Unicode. Se a aplicação precisar considerar certos caracteres equivalentes ou seguir regras específicas de um idioma, defina e teste esse comportamento explicitamente.

Neste exemplo, os dois valores são convertidos para minúsculas antes da comparação:

const first = "Hello";
const second = "hello";
const equalIgnoringCase = first.toLowerCase() === second.toLowerCase();
console.log(equalIgnoringCase);
true

A conversão permite uma comparação simples de igualdade porque os dois valores são normalizados antes da comparação estrita. Ela cria novas strings convertidas e não altera os valores originais. Para equivalência ou ordenação sensível ao idioma, use localeCompare() e escolha as opções com cuidado.

Use localeCompare() quando a comparação depender do idioma

localeCompare() compara strings segundo regras de ordenação e retorna um número: zero significa que elas são equivalentes conforme as opções selecionadas; um valor negativo ou positivo indica a ordem entre elas. Para verificar igualdade segundo essas regras, confira se o resultado é zero.

A opção sensitivity determina quais diferenças são relevantes. Com "accent", diferenças de maiúsculas e minúsculas são ignoradas, mas diferenças de acento continuam relevantes. Com "base", tanto maiúsculas e minúsculas quanto acentos podem ser ignorados. O exemplo compara "café" com "CAFÉ" usando "accent"; por isso, os valores são considerados equivalentes. Uma grafia sem acento também pode ser considerada equivalente com "base". O comportamento exato da ordenação depende do idioma; informe um locale se a aplicação exigir as regras de ordenação de uma língua específica e confira os casos importantes para seus usuários.

const result = "café".localeCompare("CAFÉ", undefined, { sensitivity: "accent" });
console.log(result === 0);
true

Use essa abordagem quando a equivalência precisar seguir regras de ordenação. Para uma comparação simples que ignore maiúsculas e minúsculas, sem regras específicas de um idioma, converter as duas strings costuma ser mais direto.

Use uma expressão regular quando precisar encontrar um padrão

Uma expressão regular é útil para localizar texto que corresponda a um padrão. A flag i faz a correspondência ignorar maiúsculas e minúsculas, enquanto test() informa se o padrão aparece em algum ponto da string. Isso não equivale a comparar strings completas: sem âncoras, a expressão pode corresponder apenas a parte do valor. Para exigir uma correspondência exata com texto informado pelo usuário, escape os metacaracteres da expressão regular e ancore as duas extremidades. Em JavaScript, $ também pode corresponder antes de um terminador de linha final; por isso, o exemplo acrescenta uma asserção de fim para exigir o fim real do valor. O texto fornecido é escapado antes de criar uma RegExp.

const userText = "JavaScript";
const escapedText = userText.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
const exactPattern = new RegExp("^" + escapedText + "$(?![\\s\\S])", "i");
console.log(exactPattern.test("javascript"));
true

Se o objetivo for comparar duas strings, a conversão de caixa ou localeCompare() costuma deixar a intenção mais clara. Evite adicionar a flag g a uma expressão regular reutilizada com test(), a menos que você controle deliberadamente o lastIndex: testes globais podem alterar o estado entre chamadas. Em resumo, use a conversão de caixa para igualdade comum, localeCompare() quando as regras de ordenação do idioma afetarem a equivalência e uma expressão regular quando a entrada precisar corresponder a um padrão.