¿Cómo hacer una comparación de cadenas que no distinga entre mayúsculas y minúsculas?

Resuelto flybywire asked hace 14 años • 23 respuestas

¿Cómo realizo una comparación de cadenas que no distingue entre mayúsculas y minúsculas en JavaScript?

flybywire avatar Jan 26 '10 23:01 flybywire
Aceptado

EDITAR: Esta respuesta se agregó originalmente hace más de 10 años. Hoy deberíamos usar localeCompare. Vea las otras respuestas.

La forma más sencilla de hacerlo (si no le preocupan los caracteres especiales Unicode) es llamar a toUpperCase:

var areEqual = string1.toUpperCase() === string2.toUpperCase();
SLaks avatar Jan 26 '2010 16:01 SLaks

EDITAR : Esta respuesta se agregó originalmente hace 9 años. Hoy deberías usar localeComparecon la sensitivity: 'accent'opción:

function ciEquals(a, b) {
    return typeof a === 'string' && typeof b === 'string'
        ? a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0
        : a === b;
}

console.log("'a' = 'a'?", ciEquals('a', 'a'));
console.log("'AaA' = 'aAa'?", ciEquals('AaA', 'aAa'));
console.log("'a' = 'á'?", ciEquals('a', 'á'));
console.log("'a' = 'b'?", ciEquals('a', 'b'));
Expandir fragmento

Indica que se { sensitivity: 'accent' }deben localeCompare()tratar dos variantes de la misma letra base como iguales a menos que tengan acentos diferentes (como en el tercer ejemplo) anterior.

Alternativamente, puede usar { sensitivity: 'base' }, que trata dos caracteres como equivalentes siempre que su carácter base sea el mismo (por lo que Ase trataría como equivalente a á).

Tenga en cuenta que el tercer parámetro localeCompareno es compatible con IE10 o versiones inferiores ni con ciertos navegadores móviles (consulte la tabla de compatibilidad en la página vinculada anteriormente), por lo que si necesita admitir esos navegadores, necesitará algún tipo de respaldo:

function ciEqualsInner(a, b) {
    return a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0;
}

function ciEquals(a, b) {
    if (typeof a !== 'string' || typeof b !== 'string') {
        return a === b;
    }

    //      v--- feature detection
    return ciEqualsInner('A', 'a')
        ? ciEqualsInner(a, b)
        : /*  fallback approach here  */;
}

Respuesta original

La mejor manera de hacer una comparación que no distinga entre mayúsculas y minúsculas en JavaScript es utilizar match()el método RegExp con la ibandera.

Búsqueda que no distingue entre mayúsculas y minúsculas

Cuando ambas cadenas que se comparan son variables (no constantes), entonces es un poco más complicado porque necesita generar una expresión regular a partir de la cadena, pero pasar la cadena al constructor RegExp puede resultar en coincidencias incorrectas o fallidas si la cadena tiene una expresión regular especial. personajes en él.

Si le interesa la internacionalización, no utilice toLowerCase()o, toUpperCase()ya que no proporciona comparaciones precisas que no distingan entre mayúsculas y minúsculas en todos los idiomas.

http://www.i18nguy.com/unicode/turkish-i18n.html

Samuel Neff avatar Jan 26 '2010 16:01 Samuel Neff

Como se dijo en comentarios recientes, string::localeCompareadmite comparaciones que no distinguen entre mayúsculas y minúsculas (entre otras cosas poderosas).

He aquí un ejemplo sencillo

'xyz'.localeCompare('XyZ', undefined, { sensitivity: 'base' }); // returns 0

Y una función genérica que podrías usar.

function equalsIgnoringCase(text, other) {
    return text.localeCompare(other, undefined, { sensitivity: 'base' }) === 0;
}

Tenga en cuenta que, en lugar de hacerlo undefined, probablemente debería ingresar la configuración regional específica con la que está trabajando. Esto es importante como se indica en los documentos de MDN.

en sueco, ä y a son letras base separadas

Opciones de sensibilidad

Opciones de sensibilidad tabuladas de MDN

Soporte del navegador

Al momento de la publicación, UC Browser para Android y Opera Mini no admiten parámetros locales ni de opciones . Consulte https://caniuse.com/#search=localeCompare para obtener información actualizada.

Jay Wick avatar Jun 23 '2018 22:06 Jay Wick