HOWTO · JavaScript
Comparaison de chaînes sans tenir compte de la casse en JavaScript
Découvrez comment comparer des chaînes JavaScript sans tenir compte de la casse, avec la conversion de casse, localeCompare() et les expressions régulières.
Sur cette page
L’égalité entre chaînes en JavaScript tient compte de la casse : "Hello" === "hello" renvoie donc false. Pour une comparaison d’égalité simple sans tenir compte de la casse, convertissez les deux chaînes avec toLowerCase(), puis comparez-les. Utilisez localeCompare() si les règles doivent tenir compte d’une langue, et une expression régulière si vous cherchez à faire correspondre un motif plutôt qu’à comparer deux chaînes complètes.
Convertir les deux chaînes dans la même casse pour une comparaison simple
Convertissez les deux valeurs de la même façon avant de les comparer avec l’égalité stricte. toLowerCase() est un choix courant ; le même principe fonctionne avec toUpperCase(), mais aucune de ces méthodes n’est préférable dans tous les cas. Cette conversion est pratique pour les identifiants ordinaires et les saisies utilisateur, mais elle ne constitue pas une opération universelle de normalisation de la casse Unicode. Si votre application doit traiter certaines lettres comme équivalentes ou suivre des règles propres à une langue, choisissez et vérifiez explicitement le comportement voulu.
L’exemple compare deux valeurs après les avoir converties en minuscules :
const first = "Hello";
const second = "hello";
const equalIgnoringCase = first.toLowerCase() === second.toLowerCase();
console.log(equalIgnoringCase);
true
Cette méthode convient à une comparaison d’égalité simple, car les deux valeurs sont normalisées avant leur comparaison stricte. La conversion crée de nouvelles chaînes et ne modifie pas les valeurs d’origine. Pour une équivalence ou un ordre qui dépend de la langue, utilisez localeCompare() en choisissant ses options avec soin.
Utiliser localeCompare() lorsque la comparaison dépend de la langue
localeCompare() compare les chaînes selon des règles de collation et renvoie un nombre : zéro signifie que les chaînes sont considérées comme équivalentes avec les options choisies ; une valeur négative ou positive indique leur ordre. Pour tester l’égalité, vérifiez si le résultat vaut zéro.
L’option sensitivity détermine quelles différences sont prises en compte. Avec "accent", les différences de casse sont ignorées, mais les accents restent significatifs. Avec "base", la casse et les accents peuvent tous deux être ignorés. L’exemple compare "café" à "CAFÉ" avec "accent" : les valeurs sont donc considérées comme équivalentes. Une graphie sans accent peut également être équivalente avec "base". Le comportement précis de la collation dépend de la langue ; indiquez-en une si votre application doit respecter un ordre linguistique particulier, puis vérifiez les chaînes importantes pour vos utilisateurs.
const result = "café".localeCompare("CAFÉ", undefined, { sensitivity: "accent" });
console.log(result === 0);
true
Choisissez cette approche lorsque l’équivalence doit suivre les règles de collation. Pour une simple égalité sans collation propre à une langue, la conversion des deux chaînes est plus directe.
Utiliser une expression régulière pour rechercher un motif
Une expression régulière sert à trouver un texte qui correspond à un motif. Son indicateur i rend la recherche insensible à la casse, tandis que test() indique si le motif correspond quelque part dans une chaîne. Ce n’est pas la même chose qu’une comparaison générale de chaînes : sans ancres, l’expression peut ne correspondre qu’à une partie de la valeur. Pour exiger une correspondance exacte avec un texte fourni par l’utilisateur, échappez les métacaractères des expressions régulières et ancrez les deux extrémités. En JavaScript, $ peut aussi correspondre juste avant un terminateur de ligne final ; l’exemple ajoute donc une assertion de fin pour exiger la fin réelle de la valeur. Il échappe le texte fourni avant de construire une instance de RegExp.
const userText = "JavaScript";
const escapedText = userText.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
const exactPattern = new RegExp("^" + escapedText + "$(?![\\s\\S])", "i");
console.log(exactPattern.test("javascript"));
true
Si vous souhaitez comparer deux chaînes, la conversion de casse ou localeCompare() est généralement plus claire. Évitez l’indicateur g avec une expression régulière réutilisée par test(), sauf si vous gérez volontairement son lastIndex : les tests globaux peuvent modifier cet état d’un appel à l’autre. En bref, utilisez la conversion de casse pour une égalité ordinaire, localeCompare() lorsque la collation linguistique influe sur l’équivalence, et une expression régulière lorsque la valeur doit correspondre à un motif.