501 Stimmen

Enthält Groß- und Kleinschreibung nicht berücksichtigt

Ich habe die folgenden:

if (referrer.indexOf("Ral") == -1) { ... }

Was ich gerne mache, ist Ral Groß- und Kleinschreibung nicht berücksichtigt werden, so dass sie RAl , rAl usw. und passen trotzdem.

Gibt es eine Möglichkeit zu sagen, dass Ral muss die Groß- und Kleinschreibung nicht beachtet werden?

4 Stimmen

Ich denke, dass die Groß-/Kleinschreibung nicht berücksichtigende Regex die elegantere Lösung ist, aber jeder sollte die Fallstricke beim Erstellen einer RegExp direkt aus Benutzereingaben. Zum Beispiel könnte ein Benutzer eingeben * und es würde ein Fehler in der RegExp Konstrukteur. Bei der akzeptierten Lösung gibt es dieses Problem nicht.

690voto

Rob W Punkte 327048

Añadir .toUpperCase() nach referrer . Mit dieser Methode wird die Zeichenkette in eine Zeichenkette mit Großbuchstaben umgewandelt. Verwenden Sie dann .indexOf() mit RAL anstelle von Ral .

if (referrer.toUpperCase().indexOf("RAL") === -1) { 

Das Gleiche kann auch mit einem regulären Ausdruck erreicht werden (besonders nützlich, wenn Sie gegen dynamische Muster testen wollen):

if (!/Ral/i.test(referrer)) {
   //    ^i = Ignore case flag for RegExp

23 Stimmen

Die letztere Methode ist korrekter; die erstere wird bei dem türkischen I und anderen problematischen Groß-/Kleinbuchstabenpaaren scheitern: i18nguy.com/unicode/turkish-i18n.html

33 Stimmen

Für Türkisch wäre es besser, wenn Sie toLocaleLowerCase() ( ref )

2 Stimmen

Letzteres beantwortet die Frage nicht, sondern sagt nur, ob es vorhanden ist, und nicht, wie der Index der Übereinstimmung lautet. Entweder ist der Titel der Frage falsch, oder die Frage.

110voto

Kfir Erez Punkte 2980

Eine weitere Möglichkeit ist die Verwendung der folgenden Suchmethode:

if (referrer.search(new RegExp("Ral", "i")) == -1) { ...

Das sieht eleganter aus, als die gesamte Zeichenkette in Kleinbuchstaben umzuwandeln, und ist vielleicht auch effizienter.
Mit toLowerCase() Der Code hat zwei Durchgänge über die Zeichenkette, einen Durchgang über die gesamte Zeichenkette, um sie in Kleinbuchstaben umzuwandeln, und einen weiteren, um nach dem gewünschten Index zu suchen.
Mit RegExp der Code hat einen Durchgang über die Zeichenfolge, die er sucht, um den gewünschten Index zu entsprechen.

Daher empfehle ich bei langen Strings die Verwendung der RegExp Version (ich vermute, dass diese Effizienz bei kurzen Zeichenketten durch die Erstellung des RegExp Objekt)

3 Stimmen

Meine Tests haben gezeigt, dass dies auch ein wenig schneller ist: jsperf.com/case-insensitive-indexof

7 Stimmen

Stand 2018.10.24, toLowerCase gewinnt mit großem Abstand in Chrome. toLowerCase (95.914.378 - ±0,89% - am schnellsten), regex indexOf (269.307 - ±0,87% 100% langsamer)

0 Stimmen

Es scheint JSPerf ist jetzt tot, so habe ich den Test auf JSBenchme neu erstellt: jsbench.me/bckqv6ii1c/1 Ab 2021 auf einem M1 Macbook Air ist Regex 99,43% langsamer als indexOf.

39voto

Ab ES2016 können Sie auch eine etwas bessere / einfachere / elegantere Methode verwenden (Groß- und Kleinschreibung beachten):

if (referrer.includes("Ral")) { ... }

oder (Groß- und Kleinschreibung wird nicht berücksichtigt):

if (referrer.toLowerCase().includes(someString.toLowerCase())) { ... }

Hier ist ein Vergleich von .indexOf() y .includes() : https://dev.to/adroitcoder/includes-vs-indexof-in-javascript

2 Stimmen

Ich glaube nicht, dass bei Includes die Groß- und Kleinschreibung eine Rolle spielt.

11 Stimmen

@Kyles includes es Groß- und Kleinschreibung in Chrome: versuchen 'fooBar'.includes('bar') ==> false

22voto

gilly3 Punkte 83450

Verwenden Sie eine RegExp:

if (!/ral/i.test(referrer)) {
    ...
}

Oder, verwenden Sie .toLowerCase() :

if (referrer.toLowerCase().indexOf("ral") == -1)

1 Stimmen

+1, dies könnte möglicherweise korrekter sein, indem das "Türkisch-I-Problem" und andere derartige Fallstricke vermieden werden: i18nguy.com/unicode/turkish-i18n.html

12voto

cheeken Punkte 32687

Hier gibt es mehrere Ansätze.

Wenn Sie eine Prüfung ohne Berücksichtigung der Groß- und Kleinschreibung nur für diese Instanz durchführen möchten, gehen Sie wie folgt vor.

if (referrer.toLowerCase().indexOf("Ral".toLowerCase()) == -1) {
    ...

Wenn Sie diese Prüfung regelmäßig durchführen, können Sie alternativ eine neue indexOf() -ähnliche Methode zu String , wobei die Groß- und Kleinschreibung nicht berücksichtigt werden muss.

String.prototype.indexOfInsensitive = function (s, b) {
    return this.toLowerCase().indexOf(s.toLowerCase(), b);
}

// Then invoke it
if (referrer.indexOfInsensitive("Ral") == -1) { ...

1 Stimmen

Bei modernen Browsern, die Folgendes unterstützen defineProperty schlage ich vor Object.defineProperty(String.prototype, 'indexOfInsensitive', {value: function(s,b){return this.toLowerCase().indexOf((s+'').toLowerCase(),b);}}); . Zwei Aktualisierungen: Explizite String-Konvertierung mit (s+'') und nicht aufzählbar in einer Schleife ( for(var i in '') ... zeigt nicht indexOfInsensitive .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X