¿Cómo hacer una comparación de cadenas que no distinga entre mayúsculas y minúsculas?
¿Cómo realizo una comparación de cadenas que no distingue entre mayúsculas y minúsculas en JavaScript?
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();
EDITAR : Esta respuesta se agregó originalmente hace 9 años. Hoy deberías usar localeCompare
con 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'));
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 A
se trataría como equivalente a á
).
Tenga en cuenta que el tercer parámetro localeCompare
no 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 i
bandera.
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
Como se dijo en comentarios recientes, string::localeCompare
admite 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
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.