Wie führe ich eine Groß-/Kleinschreibung-ignorierende Zeichenfolgenvergleich in JavaScript durch?
Antworten
Zu viele Anzeigen?BEARBEITEN: Diese Antwort wurde vor 9 Jahren hinzugefügt. Heutzutage sollten Sie localeCompare
mit der Option sensitivity: 'accent'
verwenden:
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'));
Die Option { sensitivity: 'accent' }
sagt localeCompare()
, dass zwei Varianten des gleichen Basisschriftzeichens gleich behandelt werden sollen, außer wenn sie unterschiedliche Akzente haben (wie im dritten Beispiel) oben.
Alternativ können Sie { sensitivity: 'base' }
verwenden, um zwei Zeichen als äquivalent zu behandeln, solange ihr Basiszeichen identisch ist (also würde A
als äquivalent zu á
behandelt).
Beachten Sie, dass der dritte Parameter von localeCompare
in IE10 oder niedriger oder bestimmten mobilen Browsern nicht unterstützt wird (siehe die Kompatibilitätstabelle auf der oben verlinkten Seite), also wenn Sie diese Browser unterstützen müssen, benötigen Sie eine Art Ersatz:
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-Erkennung
return ciEqualsInner('A', 'a')
? ciEqualsInner(a, b)
: /* Fallback-Ansatz hier */;
}
Ursprüngliche Antwort
Der beste Weg, einen Groß-/Kleinschreibung-unabhängigen Vergleich in JavaScript durchzuführen, ist die Verwendung der RegExp-Methode match()
mit dem Flag i
.
Groß-/Kleinschreibung-unabhängige Suche
Wenn beide verglichenen Zeichenfolgen Variablen sind (nicht Konstanten), ist es etwas komplizierter, da Sie eine RegExp aus der Zeichenfolge generieren müssen, jedoch kann das Übergeben der Zeichenfolge an den RegExp-Konstruktor zu falschen Übereinstimmungen oder fehlgeschlagenen Übereinstimmungen führen, wenn die Zeichenfolge Sonderzeichen für Regex enthält.
Wenn Sie internationalisieren möchten, verwenden Sie nicht toLowerCase()
oder toUpperCase()
, da dies in allen Sprachen keine genauen Groß-/Kleinschreibung-unabhängigen Vergleiche bietet.
Wie in den neuesten Kommentaren erwähnt, unterstützt string::localeCompare
fallunabhängige Vergleiche (unter anderem).
Hier ist ein einfaches Beispiel
'xyz'.localeCompare('XyZ', undefined, { sensitivity: 'base' }); // gibt 0 zurück
Und eine generische Funktion, die du verwenden könntest
function equalsIgnoringCase(text, other) {
return text.localeCompare(other, undefined, { sensitivity: 'base' }) === 0;
}
Beachte, dass du anstelle von undefined
wahrscheinlich die spezifische Region eingeben solltest, mit der du arbeitest. Dies ist wichtig, wie in den MDN-Dokumenten angegeben
Im Schwedischen sind ä und a separate Grundbuchstaben
Empfindlichkeitsoptionen
Browser-Unterstützung
Zum Zeitpunkt des Postings unterstützen der UC Browser für Android und Opera Mini nicht die locale und options Parameter. Bitte prüfe https://caniuse.com/#search=localeCompare für aktuelle Informationen.
Update:
Gemäß den Kommentaren überprüft die vorherige Antwort, ob Quelle das Schlüsselwort enthält
, um es gleichwertig zu machen, wird ^
und $
hinzugefügt.
(/^Schlüsselwort$/i).test(Quelle)
Mit Hilfe von regulären Ausdrücken können wir dies auch erreichen.
(/Schlüsselwort/i).test(Quelle)
/i
steht für Groß-/Kleinschreibung ignorieren. Wenn nicht notwendig, können wir dies ignorieren und statt dessen für NICHT-Groß-/Kleinschreibungssensitive Übereinstimmungen testen wie
(/Schlüsselwort/).test(Quelle)
Denken Sie daran, dass die Groß- und Kleinschreibung eine ortsabhängige Operation ist. Je nach Szenario möchten Sie dies möglicherweise berücksichtigen. Wenn Sie beispielsweise die Namen von zwei Personen vergleichen, sollten Sie die Sprachumgebung berücksichtigen, aber wenn Sie maschinengenerierte Werte wie UUID vergleichen, müssen Sie dies möglicherweise nicht. Deshalb verwende ich die folgende Funktion in meiner Hilfsbibliothek (beachten Sie, dass die Typüberprüfung aus Leistungsgründen nicht enthalten ist).
function compareStrings (string1, string2, ignoreCase, useLocale) {
if (ignoreCase) {
if (useLocale) {
string1 = string1.toLocaleLowerCase();
string2 = string2.toLocaleLowerCase();
}
else {
string1 = string1.toLowerCase();
string2 = string2.toLowerCase();
}
}
return string1 === string2;
}
- See previous answers
- Weitere Antworten anzeigen