¿Cómo realizo la comparación de cadenas sin distinción entre mayúsculas y minúsculas en JavaScript?
javascript
string
flybywire
fuente
fuente
.localeCompare()
método javascript recién agregado . Solo es compatible con los navegadores modernos en el momento de la escritura (IE11 +). ver developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…"A".localeCompare( "a" );
regresa1
en la Consola Chrome 48."a"
viene antes"A"
cuando se ordena. Como"a"
viene antes"b"
. Si no se desea este comportamiento, uno podría desear.toLowerCase()
cada letra / cadena. es decir."A".toLowerCase().localeCompare( "a".toLowerCase() )
ver developer.mozilla.org/en/docs/Web/JavaScript/Reference/…===
comprobará la igualdad, pero no será lo suficientemente bueno para ordenar / ordenar cadenas (vea la pregunta que originalmente vinculé).Respuestas:
La forma más sencilla de hacerlo (si no le preocupan los caracteres Unicode especiales) es llamar
toUpperCase
:fuente
if you're not worried about special Unicode characters
.toUpperCase
mástoLowerCase
?EDITAR : Esta respuesta se agregó originalmente hace 9 años. Hoy deberías usar
localeCompare
con lasensitivity: 'accent'
opción:El
{ sensitivity: 'accent' }
le dicelocaleCompare()
que trate dos variantes de la misma letra base como la misma, 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 (porA
lo que se trataría como equivalente aá
).Tenga en cuenta que el tercer parámetro de
localeCompare
no es compatible con IE10 o navegadores móviles inferiores o determinados (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:Respuesta original
La mejor manera de hacer una comparación entre mayúsculas y minúsculas en JavaScript es usar el
match()
método RegExp con lai
bandera.Búsqueda sin distinción 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 un RegExp a partir de la cadena, pero pasar la cadena al constructor RegExp puede resultar en coincidencias incorrectas o fallas si la cadena tiene expresiones regulares especiales personajes en el mismo.
Si le importa la internacionalización, no la use
toLowerCase()
otoUpperCase()
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
fuente
'a'.localeCompare('A')
y como la operación que estoy buscando.localeCompare
versión requiere que el motor de JavaScript compatible con la API ECMAScript® internacionalización , que se no sea requerido. Entonces, antes de confiar en él, es posible que desee comprobar que funciona en el entorno que está utilizando. Por ejemplo:const compareInsensitive = "x".localeCompare("X", undefined, {sensitivity: "base"}) === 0 ? (a, b) => a.localeCompare(b, undefined, {sensitivity: "base"}) : (a, b) => a.toLowerCase().localeCompare(b.toLowerCase());
o algo así.Como se dijo en comentarios recientes,
string::localeCompare
admite comparaciones que no distinguen entre mayúsculas y minúsculas (entre otras cosas poderosas).Aquí hay un ejemplo simple
Y una función genérica que podrías usar
Tenga en cuenta que en lugar de
undefined
usted 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 MDNOpciones de sensibilidad
Soporte del navegador
Al momento de la publicación, UC Browser para Android y Opera Mini no admiten parámetros de configuración regional y opciones . Consulte https://caniuse.com/#search=localeCompare para obtener información actualizada.
fuente
Con la ayuda de la expresión regular también podemos lograr.
/i
es por ignorar caso. Si no es necesario, podemos ignorar y probar NO coincide con mayúsculas y minúsculas comofuente
keyWORD
dará como resultado una coincidencia positiva. Pero la cadenathis is a keyword yo
okeywords
también dará como resultado una coincidencia positiva. Tenga en cuenta eso :-)/^keyword$/.test(source)
, pero 1) sikeyword
no es una constante, necesitaría hacernew RegExp('^' + x + '$').test(source)
y 2) recurrir a una expresión regular para probar algo tan simple como la igualdad de cadenas sin distinción entre mayúsculas y minúsculas es en absoluto muy eficiente.Recuerde que la carcasa es una operación específica de la localidad. Dependiendo del escenario, es posible que desee tener eso en cuenta. Por ejemplo, si está comparando los nombres de dos personas, es posible que desee considerar la configuración regional, pero si está comparando valores generados por la máquina, como UUID, es posible que no lo haga. Es por eso que uso la siguiente función en mi biblioteca de utilidades (tenga en cuenta que la verificación de tipos no está incluida por razones de rendimiento).
fuente
compareStrings("", "")
daráfalse
a pesar del hecho de que las cuerdas son iguales.true
para mí. Tal vez es un error con su navegador?Recientemente he creado una micro biblioteca que proporciona ayudantes de cadena que no distinguen entre mayúsculas y minúsculas: https://github.com/nickuraltsev/ignore-case . (Se usa
toUpperCase
internamente).fuente
si le preocupa la dirección de la desigualdad (tal vez desee ordenar una lista), prácticamente tiene que hacer una conversión de mayúsculas y minúsculas, ya que hay más caracteres en minúscula en unicode que mayúsculas a LowCase es probablemente la mejor conversión para usar.
Javascript parece usar la configuración regional "C" para las comparaciones de cadenas, por lo que el orden resultante será feo si las cadenas contienen letras distintas de ASCII. no se puede hacer mucho al respecto sin hacer una inspección mucho más detallada de las cadenas.
fuente
Supongamos que queremos encontrar la variable de cadena
needle
en la variable de cadenahaystack
. Hay tres trampas:string.toUpperCase
ystring.toLowerCase
. Utilice una expresión regular que ignore mayúsculas y minúsculas. Por ejemplo,var needleRegExp = new RegExp(needle, "i");
seguido deneedleRegExp.test(haystack)
.needle
. Tenga cuidado de queneedle
no contenga ninguna expresión especial de caracteres especiales . Escapar de estos utilizandoneedle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
.needle
yhaystack
, simplemente ignorando mayúsculas y minúsculas, asegúrese de agregar"^"
al comienzo y"$"
al final de su constructor de expresiones regulares.Teniendo en cuenta los puntos (1) y (2), un ejemplo sería:
fuente
new RegExp(...)
parte de la línea 3 por el siguiente:new RegExp("^" + needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") + "$", "i");
. Esto asegura que no haya otros caracteres antes o después de su cadena de búsquedaneedle
.Hay dos formas de comparación entre mayúsculas y minúsculas:
===
). Cómo el operador estricto trata los operandos lee cosas en: http://www.thesstech.com/javascript/relational-logical-operatorsUtilice el método de cadena "buscar" para la búsqueda sin distinción entre mayúsculas y minúsculas. Lea sobre la búsqueda y otros métodos de cadena en: http://www.thesstech.com/pattern-matching-using-string-methods
fuente
Muchas respuestas aquí, pero me gusta agregar una solución basada en extender la lib de String:
¡De esta manera puedes usarlo como lo haces en Java!
Ejemplo:
La salida será:
fuente
Use RegEx para la coincidencia de cadenas o la comparación.
En JavaScript, puede usar
match()
para la comparación de cadenas, no olvide poneri
RegEx.Ejemplo:
fuente
matchString.match(/^test$/i)
.matchString.match(/x/i)
funcionaría? Si no, ¿qué funcionaría?fuente
Si ambas cadenas son de la misma configuración regional conocida, es posible que desee utilizar un
Intl.Collator
objeto como este:Obviamente, es posible que desee almacenar en caché
Collator
para una mejor eficiencia.Las ventajas de este enfoque es que debería ser mucho más rápido que usar RegExps y se basa en un conjunto extremadamente personalizable (consulte la descripción
locales
yoptions
los parámetros del constructor en el artículo anterior) de los collares listos para usar.fuente
accent
, que lo mantiene sin distinción entre mayúsculas y minúsculas, pero trataa
yá
como caracteres separados. Entonces,base
oaccent
ambos podrían ser apropiados dependiendo de las necesidades exactas.Escribí una extensión. muy trivial
fuente
String#isEqual
o deObject#isEqual
forma nativa, todas sus páginas se comportan de manera diferente y podrían hacer cosas raras si la especificación no coincide exactamente con la suya.Incluso esta pregunta ya ha respondido. Tengo un enfoque diferente para usar RegExp y coincidir para ignorar mayúsculas y minúsculas. Por favor vea mi enlace https://jsfiddle.net/marchdave/7v8bd7dq/27/
fuente
¿Qué tal NO lanzar excepciones y NO usar expresiones regulares lentas?
El fragmento anterior supone que no desea hacer coincidir si cualquiera de las cadenas es nula o no está definida.
Si desea hacer coincidir nulo / indefinido, entonces:
Si por alguna razón te importa indefinido vs nulo:
fuente
str1 == str2 || ...
Como ninguna respuesta proporcionó claramente un fragmento de código simple para usar
RegExp
, este es mi intento:Tiene varias ventajas:
undefined
por ejemplo, bloquearía una expresión comostr1.toUpperCase()
).RegExp
cuerda.fuente
Esta es una versión mejorada de esta respuesta .
Usos y pruebas:
Mostrar fragmento de código
fuente
Convierta ambos a menor (solo una vez por razones de rendimiento) y compárelos con el operador ternario en una sola línea:
fuente
Si sabe que está tratando con
ascii
texto, puede usar una comparación de desplazamiento de caracteres en mayúsculas / minúsculas.Solo asegúrese de que la cadena de su cadena "perfecta" (con la que desea hacer coincidir) esté en minúsculas:
fuente
Me gusta esta variación rápida de taquigrafía:
Procesamiento rápido y hace lo que se pretende.
fuente
Esta
javascript
biblioteca parece proporcionar muchas operaciones de cadena. Es muy conveniente de usarCómo instalar
Importar
Ignorecase Compare String
fuente