Enthält Groß- und Kleinschreibung nicht

413

Ich habe folgendes:

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

Was ich tun möchte , ist zu machen , RalGroß- und Kleinschreibung, so dass es sein kann RAl, rAlusw. und noch entsprechen.

Gibt es eine Möglichkeit zu sagen, dass Raldie Groß- und Kleinschreibung nicht berücksichtigt werden muss?

Nate Pet
quelle
3
Ich denke, dass die Groß- und Kleinschreibung ohne Berücksichtigung der Groß- und Kleinschreibung die elegantere Lösung ist, aber jeder sollte die Fallstricke berücksichtigen, die beim Erstellen einer RegExpdirekt aus Benutzereingaben stammenden Datei entstehen. Zum Beispiel könnte ein Benutzer eingeben *und ein Fehler würde im RegExpKonstruktor ausgelöst . Die akzeptierte Lösung hat dieses Problem nicht.
Bitte

Antworten:

604

In .toLowerCase()nach referrer. Diese Methode wandelt die Zeichenfolge in eine Kleinbuchstabenzeichenfolge um. Verwenden Sie dann .indexOf()using ralanstelle von Ral.

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

Dasselbe kann auch mit einem regulären Ausdruck erreicht werden (besonders nützlich, wenn Sie anhand dynamischer Muster testen möchten):

if (!/Ral/i.test(referrer)) {
   //    ^i = Ignore case flag for RegExp
Rob W.
quelle
16
Die letztere Methode ist korrekter; Ersteres wird für das türkische I und andere problematische Groß- / Kleinbuchstabenpaare fehlschlagen
Domenic
23
Für Türkisch wäre es besser, toLocaleLowerCase()( ref )
Mottie
2
Letzterer beantwortet die Frage nicht, sondern sagt nur, wenn sie vorhanden ist, und erhält nicht den Index des Spiels. Entweder ist der Fragentitel falsch oder die Frage.
Maslow
10
@Maslow Das Beispiel der Frage betraf das Testen der Fallunempfindlichkeit. Wenn Sie den Index erhalten möchten, verwenden Sie die Methode des.search Strings:var index = referrer.search(/Ral/i);
Rob W
7
Die zusätzliche Komplikation des dynamischen Ansatzes für reguläre Ausdrücke besteht darin, dass die Suchzeichenfolge, z. B. "Ral", Sonderzeichen für reguläre Ausdrücke wie $. * Enthält. usw., Sie hätten Probleme, also müssten Sie den Sonderzeichen entkommen, siehe Mike Samuels Antwort in diesem Beitrag: endet mit JavaScript
zachelrath
94

Eine andere Möglichkeit besteht darin, die Suchmethode wie folgt zu verwenden:

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

Es sieht eleganter aus, als die gesamte Zeichenfolge in Kleinbuchstaben umzuwandeln, und ist möglicherweise effizienter.
Wenn toLowerCase()der Code zwei Durchgänge über die Zeichenfolge hat, wird die gesamte Zeichenfolge mit einem Durchlauf in Kleinbuchstaben konvertiert und mit einem anderen nach dem gewünschten Index gesucht.
Mit RegExpdem Code muss ein Durchlauf über die Zeichenfolge erfolgen, der dem gewünschten Index entspricht.

Daher empfehle ich bei langen Zeichenfolgen die Verwendung der RegExpVersion (ich denke, dass bei kurzen Zeichenfolgen diese Effizienz auf der Erstellung des RegExpObjekts beruht ).

Kfir Erez
quelle
2
Dies ist auch ein bisschen schneller, basierend auf meinen Tests: jsperf.com/case-insensitive-indexof
Ilan Biala
6
Ab dem 24.10.2018 gewinnt toLowerCase in Chrome mit großem Vorsprung. toLowerCase (95.914.378 - ± 0,89% - am schnellsten), Regex-Index von (269.307 - ± 0,87% 100% langsamer)
Nixkuroi
21

Verwenden Sie ein RegExp:

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

Oder verwenden Sie .toLowerCase():

if (referrer.toLowerCase().indexOf("ral") == -1)
gilly3
quelle
1
+1, dies könnte möglicherweise korrekter sein, wenn das "türkische I-Problem" und andere solche Fallstricke vermieden werden
Domenic
15

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

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

oder (ohne Berücksichtigung der Groß- und Kleinschreibung):

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

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

Łukasz Matuszewski
quelle
1
Ich denke nicht, dass Includes die Groß- und Kleinschreibung nicht berücksichtigen
Kyles
4
@Kyles includesist case-sensitive in Chrome: try 'fooBar'.includes('bar')==>false
drzaus
10

Hier gibt es einige Ansätze.

Wenn Sie nur für diese Instanz eine Prüfung ohne Berücksichtigung der Groß- und Kleinschreibung 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()Methode hinzufügen String, die jedoch die Groß- und Kleinschreibung nicht berücksichtigt.

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

// Then invoke it
if (referrer.indexOfInsensitive("Ral") == -1) { ...
frech
quelle
1
Für moderne Browser, die unterstützen defineProperty, empfehle ich Object.defineProperty(String.prototype, 'indexOfInsensitive', {value: function(s,b){return this.toLowerCase().indexOf((s+'').toLowerCase(),b);}});. Zwei Aktualisierungen: Explizite Zeichenfolgenkonvertierung mit (s+'')und nicht aufzählbar in einer Schleife ( for(var i in '') ... wird nicht angezeigt indexOfInsensitive.
Rob W
5
if (referrer.toUpperCase().indexOf("RAL") == -1) { ...
Kendall Frey
quelle
@Domenic: Bei allem Respekt vor der türkischen Kultur sollte die Türkei eine Rechtschreibreform in Betracht ziehen , um diesen Aspekt zu vereinfachen. China hat eine Reihe von Vereinfachungsreformen durchgeführt , und die Türkei hat weniger als 10% der chinesischen Bevölkerung und ein viel einfacheres Alphabet. Es kann getan werden.
Dan Dascalescu
5

Sie können dies versuchen

str = "Wow its so COOL"
searchStr = "CoOl"

console.log(str.toLowerCase().includes(searchStr.toLowerCase()))

Bakarali Sunasra
quelle
3

Beispiel für jede Sprache:

'My name is Хведор'.toLocaleLowerCase().includes('ХвЕдОр'.toLocaleLowerCase())
alex_1948511
quelle
2

Es ist 2016 und es gibt keinen klaren Weg, wie das geht? Ich hatte auf Copypasta gehofft. Ich werde es versuchen.

Konstruktionshinweise: Ich wollte die Speichernutzung minimieren und damit die Geschwindigkeit verbessern - daher werden keine Zeichenfolgen kopiert / mutiert. Ich gehe davon aus, dass V8 (und andere Motoren) diese Funktion optimieren können.

//TODO: Performance testing
String.prototype.naturalIndexOf = function(needle) {
    //TODO: guard conditions here

    var haystack = this; //You can replace `haystack` for `this` below but I wan't to make the algorithm more readable for the answer
    var needleIndex = 0;
    var foundAt = 0;
    for (var haystackIndex = 0; haystackIndex < haystack.length; haystackIndex++) {
        var needleCode = needle.charCodeAt(needleIndex);
        if (needleCode >= 65 && needleCode <= 90) needleCode += 32; //ToLower. I could have made this a function, but hopefully inline is faster and terser
        var haystackCode = haystack.charCodeAt(haystackIndex);
        if (haystackCode >= 65 && haystackCode <= 90) haystackCode += 32; //ToLower. I could have made this a function, but hopefully inline is faster and terser

        //TODO: code to detect unicode characters and fallback to toLowerCase - when > 128?
        //if (needleCode > 128 || haystackCode > 128) return haystack.toLocaleLowerCase().indexOf(needle.toLocaleLowerCase();
        if (haystackCode !== needleCode)
        {
            foundAt = haystackIndex;
            needleIndex = 0; //Start again
        }
        else
            needleIndex++;

        if (needleIndex == needle.length)
            return foundAt;
    }

    return -1;
}

Mein Grund für den Namen:

  • Sollte IndexOf im Namen haben
  • Fügen Sie kein Suffix hinzu - Of bezieht sich auf den folgenden Parameter
  • Verwenden Sie nicht "caseInsensitive", das sooooo lang ist
  • "natürlich" ist ein guter Kandidat, da standardmäßige Vergleiche, bei denen zwischen Groß- und Kleinschreibung unterschieden wird, für den Menschen in erster Linie nicht natürlich sind.

Warum nicht...:

  • toLowerCase() - mögliche wiederholte Aufrufe von toLowerCase an derselben Zeichenfolge.
  • RegExp- umständlich mit Variablen zu suchen. Sogar das RegExp-Objekt ist umständlich, Zeichen zu entkommen
Todd
quelle
2
Es ist 2016 und Sie denken immer noch, dass Englisch (oder andere Nur-ASCII-Sprachen) die einzige Sprache der Welt ist?
Roland Illig
3
@ RolandIllig Autsch. Meine Antwort passt nicht zu anderen Kulturen, das ist ein Nachteil. Ich würde jeden Einblick in die Ausweitung der Unterstützung für mehr Kulturen begrüßen. Die Welt ist ein besserer Ort für Mitarbeiter.
Todd
1

Verwenden Sie für eine bessere Suche den folgenden Code:

var myFav   = "javascript";
var theList = "VB.NET, C#, PHP, Python, JavaScript, and Ruby";

// Check for matches with the plain vanilla indexOf() method:
alert( theList.indexOf( myFav ) );

// Now check for matches in lower-cased strings:
alert( theList.toLowerCase().indexOf( myFav.toLowerCase() ) );

In der ersten Warnung () gab JavaScript "-1" zurück - mit anderen Worten, indexOf () hat keine Übereinstimmung gefunden: Dies liegt einfach daran, dass "JavaScript" in der ersten Zeichenfolge in Kleinbuchstaben und in der zweiten Zeichenfolge ordnungsgemäß großgeschrieben wird. Um mit indexOf () die Suche ohne Berücksichtigung der Groß- und Kleinschreibung durchzuführen, können Sie beide Zeichenfolgen entweder in Groß- oder Kleinbuchstaben schreiben. Dies bedeutet, dass JavaScript wie in der zweiten Warnung () nur nach dem Auftreten der gesuchten Zeichenfolge sucht, wobei die Großschreibung ignoriert wird.

Referenz: http://freewebdesigntutorials.com/javaScriptTutorials/jsStringObject/indexOfMethod.htm

Diganta Kumar
quelle
1

Wenn referreres sich um ein Array handelt, können Sie es verwendenfindIndex()

 if(referrer.findIndex(item => 'ral' === item.toLowerCase()) == -1) {...}
A-Sharabiani
quelle
0

Hier ist meine Einstellung:

Skript :

var originalText = $("#textContainer").html()
$("#search").on('keyup', function () {
  $("#textContainer").html(originalText)
  var text = $("#textContainer").html()
  var val = $("#search").val()
  if(val=="") return;
  var matches = text.split(val)
  for(var i=0;i<matches.length-1;i++) {
    var ind =  matches[i].indexOf(val)
    var len = val.length
      matches[i] = matches[i] + "<span class='selected'>" + val + "</span>"
  }
  $("#textContainer").html(matches.join(""))

HTML:

<input type="text" id="search">
<div id="textContainer">
lorem ipsum is simply dummy text of the printing and typesetting industry. lorem ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of letraset sheets containing lorem ipsum passages, and more recently with desktop publishing software like Aldus pagemaker including versions of lorem ipsum.</div>

Codepen

Michael Seltenreich
quelle