Comment effectuer une comparaison de chaînes insensible à la casse en JavaScript?
javascript
string
fil volant
la source
la source
.localeCompare()
méthode javascript nouvellement ajoutée . Uniquement pris en charge par les navigateurs modernes au moment de l'écriture (IE11 +). voir developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…"A".localeCompare( "a" );
revient1
dans la console Chrome 48."a"
vient avant le"A"
tri. Comme"a"
avant"b"
. Si ce comportement n'est pas souhaité, on peut vouloir.toLowerCase()
chaque lettre / chaîne. c'est à dire."A".toLowerCase().localeCompare( "a".toLowerCase() )
voir developer.mozilla.org/en/docs/Web/JavaScript/Reference/…===
vérifiera l'égalité mais ne sera pas assez bon pour trier / ordonner les chaînes (cf. la question à laquelle j'ai lié à l'origine).Réponses:
La façon la plus simple de le faire (si vous ne vous inquiétez pas des caractères Unicode spéciaux) est d'appeler
toUpperCase
:la source
if you're not worried about special Unicode characters
.toUpperCase
plustoLowerCase
?EDIT : Cette réponse a été ajoutée à l'origine il y a 9 ans. Aujourd'hui, vous devez utiliser
localeCompare
l'sensitivity: 'accent'
option:Le
{ sensitivity: 'accent' }
ditlocaleCompare()
de traiter deux variantes de la même lettre de base comme identiques, sauf si elles ont des accents différents (comme dans le troisième exemple) ci-dessus.Alternativement, vous pouvez utiliser
{ sensitivity: 'base' }
, qui traite deux caractères comme équivalents tant que leur caractère de base est le même (ilA
serait donc traité comme équivalent àá
).Remarque que le troisième paramètre de
localeCompare
n'est pas pris en charge dans IE10 ou inférieur ou dans certains navigateurs mobiles (voir le tableau de compatibilité sur la page liée ci-dessus), donc si vous devez prendre en charge ces navigateurs, vous aurez besoin d'une sorte de solution de rechange:Réponse originale
La meilleure façon de faire une comparaison insensible à la casse en JavaScript est d'utiliser RegExp
match()
méthode avec l'i
indicateur.Recherche insensible à la casse
Lorsque les deux chaînes comparées sont des variables (pas des constantes), c'est un peu plus compliqué, car vous devez générer un RegExp à partir de la chaîne, mais le passage de la chaîne au constructeur RegExp peut entraîner des correspondances incorrectes ou des correspondances échouées si la chaîne a une expression rationnelle spéciale personnages en elle.
Si vous vous souciez de l'internationalisation, n'utilisez pas
toLowerCase()
outoUpperCase()
car il ne fournit pas de comparaisons précises insensibles à la casse dans toutes les langues.http://www.i18nguy.com/unicode/turkish-i18n.html
la source
'a'.localeCompare('A')
et comme l'op que je recherche pour comparer la chaîne insensible à la casse.localeCompare
version nécessite que le moteur JavaScript prenne en charge l' API d'internationalisation ECMAScript® , ce qui n'est pas obligatoire. Donc, avant de vous y fier, vous voudrez peut-être vérifier qu'il fonctionne dans l'environnement que vous utilisez. Par exemple: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 quelque chose comme ça.Comme indiqué dans des commentaires récents,
string::localeCompare
prend en charge les comparaisons insensibles à la casse (entre autres choses puissantes).Voici un exemple simple
Et une fonction générique que vous pourriez utiliser
Notez qu'au lieu de
undefined
vous, vous devez probablement entrer les paramètres régionaux spécifiques avec lesquels vous travaillez. Ceci est important comme indiqué dans les documents MDNOptions de sensibilité
Prise en charge du navigateur
Au moment de la publication, UC Browser pour Android et Opera Mini ne prend pas en charge les paramètres régionaux et d' options . Veuillez consulter https://caniuse.com/#search=localeCompare pour des informations à jour.
la source
Avec l'aide de l'expression régulière, nous pouvons également atteindre.
/i
est pour ignorer la casse. Si ce n'est pas nécessaire, nous pouvons ignorer et tester la correspondance NON sensible à la casse commela source
keyWORD
entraînera une correspondance positive. Mais la chaînethis is a keyword yo
oukeywords
entraînera également une correspondance positive. Soyez conscient de cela :-)/^keyword$/.test(source)
, mais 1) si cekeyword
n'est pas une constante, vous devez le fairenew RegExp('^' + x + '$').test(source)
et 2) recourir à une expression rationnelle pour tester quelque chose d'aussi simple que l'égalité de chaîne insensible à la casse. pas du tout très efficace.N'oubliez pas que la casse est une opération spécifique aux paramètres régionaux. Selon le scénario, vous voudrez peut-être en tenir compte. Par exemple, si vous comparez les noms de deux personnes, vous voudrez peut-être tenir compte des paramètres régionaux, mais si vous comparez des valeurs générées par la machine telles que UUID, vous ne le ferez peut-être pas. C'est pourquoi j'utilise la fonction suivante dans ma bibliothèque d'utils (notez que la vérification de type n'est pas incluse pour des raisons de performances).
la source
compareStrings("", "")
donnerafalse
malgré le fait que les cordes sont égales.true
pour moi. C'est peut-être un bug avec votre navigateur?J'ai récemment créé une micro bibliothèque qui fournit des aides de chaîne insensibles à la casse: https://github.com/nickuraltsev/ignore-case . (Il utilise en
toUpperCase
interne.)la source
si vous êtes préoccupé par la direction de l'inégalité (peut-être que vous voulez trier une liste), vous devez à peu près faire la conversion de casse, et comme il y a plus de caractères en minuscules en unicode que en majuscules vers LowerCase est probablement la meilleure conversion à utiliser.
Javascript semble utiliser les paramètres régionaux "C" pour les comparaisons de chaînes, donc l'ordre résultant sera moche si les chaînes contiennent des lettres autres que ASCII. il n'y a pas grand-chose à faire à ce sujet sans effectuer une inspection beaucoup plus détaillée des cordes.
la source
Supposons que nous voulons trouver la variable chaîne
needle
dans la variable chaînehaystack
. Il y a trois pièges:string.toUpperCase
etstring.toLowerCase
. Utilisez une expression régulière qui ignore la casse à la place. Par exemple,var needleRegExp = new RegExp(needle, "i");
suivi deneedleRegExp.test(haystack)
.needle
. Attention,needle
il ne contient aucun caractère spécial d' expression régulière . Échapper à ces derniers en utilisantneedle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
.needle
ethaystack
, en ignorant simplement la casse, assurez-vous d'ajouter"^"
au début et"$"
à la fin de votre constructeur d'expressions régulières.Compte tenu des points (1) et (2), un exemple serait:
la source
new RegExp(...)
partie la ligne 3 par ce qui suit:new RegExp("^" + needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") + "$", "i");
. Cela garantit qu'il n'y a pas d'autres caractères avant ou après votre chaîne de rechercheneedle
.Il existe deux façons de comparer la casse:
===
). Comment un opérateur strict traite les opérandes lire des trucs à: http://www.thesstech.com/javascript/relational-logical-operatorsUtilisez la méthode de chaîne "recherche" pour une recherche insensible à la casse. Lisez à propos de la recherche et des autres méthodes de chaîne sur: http://www.thesstech.com/pattern-matching-using-string-methods
la source
Beaucoup de réponses ici, mais j'aime ajouter une sollution basée sur l'extension de la librairie String:
De cette façon, vous pouvez simplement l'utiliser comme vous le faites en Java!
Exemple:
La sortie sera:
la source
Utilisez RegEx pour la correspondance ou la comparaison de chaînes.
En JavaScript, vous pouvez utiliser
match()
pour la comparaison des chaînes, n'oubliez pas de mettrei
dans RegEx.Exemple:
la source
matchString.match(/^test$/i)
.matchString.match(/x/i)
fonctionnerait? Sinon, qu'est-ce qui fonctionnerait?la source
Si les deux chaînes sont des mêmes paramètres régionaux connus, vous pouvez utiliser un
Intl.Collator
objet comme celui-ci:Évidemment, vous voudrez peut-être mettre en cache le
Collator
pour une meilleure efficacité.Les avantages de cette approche est qu'il devrait être beaucoup plus rapide que d' utiliser des expressions rationnelles et repose sur une très personnalisable (voir description
locales
etoptions
paramètres du constructeur dans l'article ci - dessus) un ensemble de collateurs prêt à l'emploi.la source
accent
, ce qui la rend insensible à la casse, mais traitea
et ená
tant que caractères séparés. Donc,base
ouaccent
pourraient tous deux être appropriés en fonction des besoins exacts.J'ai écrit une extension. très trivial
la source
String#isEqual
ou deObject#isEqual
manière native toutes vos pages se comportent différemment et peuvent faire des choses étranges si la spécification ne correspond pas exactement à la vôtre.Même cette question a déjà répondu. J'ai une approche différente pour utiliser RegExp et match pour ignorer la casse. Veuillez voir mon lien https://jsfiddle.net/marchdave/7v8bd7dq/27/
la source
Que diriez-vous de ne PAS lancer d'exceptions et de NE PAS utiliser l'expression régulière lente?
L'extrait ci-dessus suppose que vous ne voulez pas correspondre si l'une des chaînes est nulle ou non définie.
Si vous souhaitez faire correspondre null / undefined, alors:
Si pour une raison quelconque, vous vous souciez d'undefined vs null:
la source
str1 == str2 || ...
Puisqu'aucune réponse n'a clairement fourni un simple extrait de code à utiliser
RegExp
, voici ma tentative:Il présente plusieurs avantages:
undefined
par exemple, planterait une expression commestr1.toUpperCase()
).RegExp
chaîne.la source
Il s'agit d'une version améliorée de cette réponse .
Utilisations et tests:
Afficher l'extrait de code
la source
Convertissez les deux en plus bas (une seule fois pour des raisons de performances) et comparez-les avec l'opérateur ternaire sur une seule ligne:
la source
Si vous savez que vous avez affaire à
ascii
texte, vous pouvez simplement utiliser une comparaison de décalage de caractères en majuscules / minuscules.Assurez-vous simplement que la chaîne de votre chaîne "parfaite" (celle avec laquelle vous voulez faire correspondre) est en minuscules:
la source
J'aime cette variante abrégée rapide -
Rapide dans le traitement et fait ce à quoi il est destiné.
la source
Cette
javascript
bibliothèque semble fournir beaucoup d'opérations sur les chaînes. C'est très pratique à utiliserComment installer
Importation
Ignorecase Compare String
la source