Wie führe ich einen Vergleich von Zeichenfolgen ohne Berücksichtigung der Groß- und Kleinschreibung in JavaScript durch?
javascript
string
Flybywire
quelle
quelle
.localeCompare()
Javascript-Methode. Wird zum Zeitpunkt des Schreibens nur von modernen Browsern unterstützt (IE11 +). siehe developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…"A".localeCompare( "a" );
kehrt1
in der Chrome 48-Konsole zurück."a"
kommt vor,"A"
wenn sortiert. Wie"a"
kommt vorher"b"
. Wenn dieses Verhalten nicht gewünscht wird, möchte man möglicherweise zu.toLowerCase()
jedem Buchstaben / jeder Zeichenfolge. dh."A".toLowerCase().localeCompare( "a".toLowerCase() )
siehe developer.mozilla.org/en/docs/Web/JavaScript/Reference/…===
prüft die Gleichheit, ist aber nicht gut genug zum Sortieren / Ordnen von Zeichenfolgen (vgl. die Frage, mit der ich ursprünglich verknüpft war).Antworten:
Der einfachste Weg, dies zu tun (wenn Sie sich keine Sorgen über spezielle Unicode-Zeichen machen), ist der Aufruf von
toUpperCase
:quelle
if you're not worried about special Unicode characters
.toUpperCase
übertoLowerCase
?EDIT : Diese Antwort wurde ursprünglich vor 9 Jahren hinzugefügt. Heute sollten Sie
localeCompare
mit dersensitivity: 'accent'
Option verwenden:Das
{ sensitivity: 'accent' }
sagtlocaleCompare()
, dass zwei Varianten desselben Basisbuchstabens als gleich behandelt werden sollen, es sei denn, sie haben unterschiedliche Akzente (wie im dritten Beispiel) oben.Alternativ können Sie verwenden
{ sensitivity: 'base' }
, bei dem zwei Zeichen als gleichwertig behandelt werden, solange ihr Basiszeichen identisch ist (diesA
würde als gleichwertig behandelt werdená
).Beachten Sie, dass der dritte Parameter von
localeCompare
in IE10 oder niedriger oder in bestimmten mobilen Browsern nicht unterstützt wird (siehe Kompatibilitätstabelle auf der oben verlinkten Seite). Wenn Sie diese Browser unterstützen müssen, benötigen Sie eine Art Fallback:Ursprüngliche Antwort
Der beste Weg, einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung in JavaScript durchzuführen, ist die Verwendung der RegExp-
match()
Methode mit demi
Flag.Suche ohne Berücksichtigung der Groß- und Kleinschreibung
Wenn beide verglichenen Zeichenfolgen Variablen (keine Konstanten) sind, ist dies etwas komplizierter, da Sie aus der Zeichenfolge ein RegExp generieren müssen. Die Übergabe der Zeichenfolge an den RegExp-Konstruktor kann jedoch zu falschen Übereinstimmungen oder fehlgeschlagenen Übereinstimmungen führen, wenn die Zeichenfolge einen speziellen regulären Ausdruck aufweist Zeichen darin.
Wenn Sie sich über die Internationalisierung Pflege nicht verwenden
toLowerCase()
odertoUpperCase()
wie es nicht genau Groß- und Kleinschreibung Vergleiche in allen Sprachen bietet.http://www.i18nguy.com/unicode/turkish-i18n.html
quelle
'a'.localeCompare('A')
und wie die Operation zurück, nach der ich suche.localeCompare
Version muss die JavaScript-Engine die ECMAScript® Internationalization API unterstützen , was nicht erforderlich ist. Bevor Sie sich darauf verlassen, sollten Sie überprüfen, ob es in der von Ihnen verwendeten Umgebung funktioniert. Zum Beispiel:const compareInsensitive = "x".localeCompare("X", undefined, {sensitivity: "base"}) === 0 ? (a, b) => a.localeCompare(b, undefined, {sensitivity: "base"}) : (a, b) => a.toLowerCase().localeCompare(b.toLowerCase());
oder so.Wie in jüngsten Kommentaren erwähnt,
string::localeCompare
werden Vergleiche ohne Berücksichtigung der Groß- und Kleinschreibung unterstützt (unter anderem leistungsstarke Dinge).Hier ist ein einfaches Beispiel
Und eine generische Funktion, die Sie verwenden könnten
Beachten Sie, dass Sie stattdessen
undefined
wahrscheinlich das spezifische Gebietsschema eingeben sollten, mit dem Sie arbeiten. Dies ist wichtig, wie in den MDN-Dokumenten angegebenEmpfindlichkeitsoptionen
Browser-Unterstützung
Zum Zeitpunkt der Buchung, UC Browser für Android und Opera Mini nicht unterstützt locale und Optionen Parameter. Aktuelle Informationen finden Sie unter https://caniuse.com/#search=localeCompare .
quelle
Mit Hilfe des regulären Ausdrucks können wir auch erreichen.
/i
ist für den Fall ignorieren. Wenn nicht notwendig, können wir ignorieren und testen, ob keine Übereinstimmung zwischen Groß- und Kleinschreibung bestehtquelle
keyWORD
einer positiven Übereinstimmung. Aber die Zeichenfolgethis is a keyword yo
oderkeywords
wird auch zu einer positiven Übereinstimmung führen. Seien Sie sich dessen bewusst :-)/^keyword$/.test(source)
. 1) Wenn dieskeyword
keine Konstante ist, müssen Sie dies tunnew RegExp('^' + x + '$').test(source)
und 2) auf einen regulären Ausdruck zurückgreifen, um etwas zu testen, das so einfach ist wie die Gleichheit der Zeichenfolge ohne Berücksichtigung der Groß- und Kleinschreibung überhaupt nicht sehr effizient.Denken Sie daran, dass das Gehäuse eine länderspezifische Operation ist. Je nach Szenario möchten Sie dies möglicherweise berücksichtigen. Wenn Sie beispielsweise Namen von zwei Personen vergleichen, möchten Sie möglicherweise das Gebietsschema berücksichtigen. Wenn Sie jedoch maschinengenerierte Werte wie UUID vergleichen, ist dies möglicherweise nicht der Fall. Aus diesem Grund verwende ich die folgende Funktion in meiner Utils-Bibliothek (beachten Sie, dass die Typprüfung aus Leistungsgründen nicht enthalten ist).
quelle
compareStrings("", "")
wirdfalse
trotz der Tatsache geben , dass die Saiten gleich sind.true
für mich zurück. Vielleicht ist es ein Fehler mit Ihrem Browser?Ich habe kürzlich eine Mikrobibliothek erstellt, die String-Helfer ohne Berücksichtigung der Groß- und Kleinschreibung bereitstellt: https://github.com/nickuraltsev/ignore-case . (Es wird
toUpperCase
intern verwendet.)quelle
Wenn Sie sich Gedanken über die Richtung der Ungleichung machen (vielleicht möchten Sie eine Liste sortieren), müssen Sie so ziemlich die Groß- und Kleinschreibung konvertieren. Da Unicode mehr Kleinbuchstaben enthält als Großbuchstaben, ist LowCase wahrscheinlich die beste Konvertierung.
Javascript scheint das Gebietsschema "C" für Zeichenfolgenvergleiche zu verwenden, sodass die resultierende Reihenfolge hässlich ist, wenn die Zeichenfolgen andere als ASCII-Buchstaben enthalten. Es kann nicht viel dagegen getan werden, ohne die Saiten genauer zu untersuchen.
quelle
Angenommen, wir möchten die Zeichenfolgenvariable
needle
in der Zeichenfolgenvariablen findenhaystack
. Es gibt drei Fallstricke:string.toUpperCase
und vermeidenstring.toLowerCase
. Verwenden Sie stattdessen einen regulären Ausdruck, bei dem Groß- und Kleinschreibung ignoriert wird. Zum Beispielvar needleRegExp = new RegExp(needle, "i");
gefolgt vonneedleRegExp.test(haystack)
.needle
. Achten Sie darauf, dassneedle
keine Sonderzeichen für reguläre Ausdrücke enthalten sind . Entkomme diesen mitneedle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
.needle
undhaystack
die Groß- und Kleinschreibung ignorieren möchten , stellen Sie sicher, dass Sie sie"^"
am Anfang und"$"
am Ende Ihres Konstruktors für reguläre Ausdrücke hinzufügen .Unter Berücksichtigung der Punkte (1) und (2) wäre ein Beispiel:
quelle
new RegExp(...)
Teil in Zeile 3 durch Folgendes ersetzen :new RegExp("^" + needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") + "$", "i");
. Dadurch wird sichergestellt, dass vor oder nach Ihrer Suchzeichenfolge keine weiteren Zeichen vorhanden sindneedle
.Es gibt zwei Möglichkeiten für einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung:
===
). Wie streng Operatoren mit Operanden umgehen, lesen Sie unter: http://www.thesstech.com/javascript/relational-logical-operatorsVerwenden Sie die Zeichenfolgenmethode "search" für die Suche ohne Berücksichtigung der Groß- und Kleinschreibung. Weitere Informationen zur Suche und zu anderen Zeichenfolgenmethoden finden Sie unter: http://www.thesstech.com/pattern-matching-using-string-methods
quelle
Viele Antworten hier, aber ich möchte eine Lösung hinzufügen, die auf der Erweiterung der String-Bibliothek basiert:
Auf diese Weise können Sie es einfach wie in Java verwenden!
Beispiel:
Ausgabe wird sein:
quelle
Verwenden Sie RegEx für die Übereinstimmung oder den Vergleich von Zeichenfolgen.
In JavaScript können Sie
match()
für den Zeichenfolgenvergleich verwenden. Vergessen Sie nicht,i
RegEx einzugeben.Beispiel:
quelle
matchString.match(/^test$/i)
.matchString.match(/x/i)
funktionieren? Wenn nicht, was würde funktionieren?quelle
Wenn beide Zeichenfolgen dasselbe bekannte Gebietsschema haben, möchten Sie möglicherweise ein
Intl.Collator
Objekt wie das folgende verwenden:Offensichtlich möchten Sie das
Collator
für eine bessere Effizienz zwischenspeichern.Der Vorteil dieses Ansatzes besteht darin, dass er viel schneller als die Verwendung von RegExps sein sollte und auf einem äußerst anpassbaren Satz gebrauchsfertiger Kollatatoren basiert (siehe Beschreibung
locales
undoptions
Konstruktorparameter im obigen Artikel).quelle
accent
, die es Groß- und Kleinschreibung, aber behandelt hälta
undá
als separate Zeichen. Sobase
oderaccent
könnte beides je nach den genauen Bedürfnissen angemessen sein.Ich habe eine Erweiterung geschrieben. sehr trivial
quelle
String#isEqual
oder sichObject#isEqual
alle Ihre Seiten nativ anders verhalten und möglicherweise seltsame Dinge tun, wenn die Spezifikation nicht genau mit Ihrer übereinstimmt.Auch diese Frage hat sich bereits beantwortet. Ich habe einen anderen Ansatz, um RegExp und Match zu verwenden, um Groß- und Kleinschreibung zu ignorieren. Bitte beachten Sie meinen Link https://jsfiddle.net/marchdave/7v8bd7dq/27/
quelle
Wie wäre es, KEINE Ausnahmen auszulösen und KEINEN langsamen regulären Ausdruck zu verwenden?
Das obige Snippet setzt voraus, dass Sie nicht übereinstimmen möchten, wenn eine der Zeichenfolgen null oder undefiniert ist.
Wenn Sie mit null / undefiniert übereinstimmen möchten, dann:
Wenn Sie sich aus irgendeinem Grund für undefined vs null interessieren:
quelle
str1 == str2 || ...
Da keine Antwort eindeutig ein einfaches Code-Snippet zur Verwendung lieferte
RegExp
, ist hier mein Versuch:Es hat mehrere Vorteile:
undefined
zum Beispiel, würde einen Ausdruck wie zum Absturz bringenstr1.toUpperCase()
).RegExp
Zeichenfolge.quelle
Dies ist eine verbesserte Version von dieser Antwort .
Verwendungen & Tests:
Code-Snippet anzeigen
quelle
Konvertieren Sie beide in niedrigere (aus Leistungsgründen nur einmal) und vergleichen Sie sie mit dem ternären Operator in einer einzigen Zeile:
quelle
Wenn Sie wissen, dass Sie mit
ascii
Text zu tun haben , können Sie einfach einen Versatzvergleich zwischen Groß- und Kleinbuchstaben verwenden.Stellen Sie einfach sicher, dass die Zeichenfolge, mit der Ihre "perfekte" Zeichenfolge (die Sie vergleichen möchten), klein geschrieben ist:
quelle
Ich mag diese schnelle Kurzvariante -
Schnell in der Verarbeitung und macht, was es beabsichtigt.
quelle
Diese
javascript
Bibliothek scheint viele Zeichenfolgenoperationen bereitzustellen. Es ist sehr bequem zu bedienenWie installiert man
Importieren
Ignorecase Compare String
quelle