Case-insensitive Suche
Ich versuche zu bekommen eine case-insensitive Suche mit zwei Zeichenfolgen in JavaScript zu arbeiten.
Normalerweise wäre es so:
var string="Stackoverflow is the BEST";
var result= string.search(/best/i);
alert(result);
Den /i
flag für groß- /Kleinschreibung.
Aber ich Suche nach einem zweiten string; ohne fahne, es funktioniert perfekt:
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(searchstring);
alert(result);
Wenn ich die /i
- flag auf die oben genannten Beispiel würde die Suche nach searchstring und nicht für das, was in der variable "searchstring" (neben z.B. nicht funktioniert):
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(/searchstring/i);
alert(result);
Wie kann ich das erreichen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Yeah, verwenden Sie
.match
eher als.search
. Das Ergebnis aus der.match
aufrufen, wird wieder die tatsächliche Zeichenfolge, die gefunden wurde selbst, aber es kann immer noch verwendet werden, als einen booleschen Wert.Mit einem regulären Ausdruck, wie das ist wahrscheinlich der gepflegten Orten und offensichtlichste Art und Weise zu tun, dass in JavaScript, aber Bedenken Sie, es ist ein regulärer Ausdruck, und kann somit enthalten die regex-Metazeichen. Wenn Sie möchten, nehmen Sie die Zeichenfolge aus, die anderswo (z.B. Benutzereingaben), oder wenn Sie wollen, um zu vermeiden, dass die Flucht viel Metazeichen, dann bist du wahrscheinlich am besten mit
indexOf
wie diese:string.match(/best/i);
.match
für boolean-Vergleich. Er sucht über das erste Ergebnis. Sie müssen aufhören, nach dem ersten match, welches.test
oder.search
tun. Überprüfen Sie die Leistung hier.toLowerCase
wird höchstwahrscheinlich fehlschlagen der Türkei-Test (moserware.com/2008/02/does-your-code-pass-turkey-test.html) und ähnlicher Fall Probleme bei der Konvertierung. Ich bin mir nicht sicher, wie Sie SieReGex
verarbeitet es, aber wenn ich raten müsste würde ich sagen, besser.var text = "best"; var exp = new RegExp(test, "i");
. Dies ist die gleiche wie/best/i
.Ersetzen
mit
s = 'a[b'; r = new RegExp(s)
Ergebnisse in ein syntax-Fehler (unterminated character class)Wenn Sie gerade auf der Suche nach einem string, anstatt einen komplizierteren regulären Ausdruck, können Sie
indexOf()
- aber denken Sie daran, beide strings in Kleinbuchstaben zuerst, weilindexOf()
groß-und Kleinschreibung:Oder in einer einzelnen Zeile auf:
Nehmen wir an, wir wollen zu finden, die string-variable
needle
in die string-variablehaystack
. Es gibt drei Einschränkungen:string.toUpperCase
undstring.toLowerCase
. Verwenden Sie einen regulären Ausdruck, die ignoriert statt. Zum Beispielvar needleRegExp = new RegExp(needle, "i");
gefolgt vonneedleRegExp.test(haystack)
.needle
. Seien Sie vorsichtig, dassneedle
enthält keine regulären Ausdruck Sonderzeichen. Entkommen diese mitneedle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
.needle
undhaystack
, einfach zu ignorieren, Fall, stellen Sie sicher, dass Sie"^"
am start und"$"
am Ende Ihrer regulären Ausdruck Konstruktor.Wobei die Punkte (1) und (2) berücksichtigt, ein Beispiel wäre:
ES6+:
includes()
zurücktrue
wennsearchString
wird an einer oder mehr Positionen oderfalse
sonst.Wenn Sie sind besorgt über die "unterminated character class" - Fall, entfernen Sie alle nicht alphanumerischen chars wäre hilfreich:
Ich wie @CHR15TO Antwort, im Gegensatz zu anderen Antworten, die ich gesehen habe, auf andere ähnliche Fragen, diese Antwort zeigt eigentlich, wie man richtig Flucht ein Benutzer bereitgestellten such-string (anstatt zu sagen, es wäre notwendig, ohne die zeigen, wie).
Aber es ist immer noch ziemlich klobig, und möglicherweise relativ langsamer. Warum also nicht eine bestimmte Lösung zu dem, was ist wahrscheinlich eine häufige Anforderung für Programmierer? (Und warum es nicht in der ES6-API BTW?)
Meine Antwort [https://stackoverflow.com/a/38290557/887092%5D auf eine ähnliche Frage ermöglicht die folgende:
Gibt es zwei Möglichkeiten für die groß-und Kleinschreibung-Vergleich:
Konvertieren von Zeichenfolgen in Großbuchstaben, und dann vergleichen Sie mit der strict-operator (
===
). Wie streng operator behandelt Operanden Sachen gelesen bei:http://www.thesstech.com/javascript/relational-logical-operators
Pattern-matching mit Hilfe von string-Methoden:
Verwenden Sie die "Suche" string-Methode für die groß /Kleinschreibung bei der Suche.
Lesen Sie über die Suche und andere string-Methoden an:
http://www.thesstech.com/pattern-matching-using-string-methods
Ich dies oft und mit einem einfachen 5 line-Prototyp, der akzeptiert varargs. Es ist schnell und arbeitet überall.
JS:
Können Sie alles in Kleinbuchstaben:
Bemerkte ich, dass, wenn der Benutzer eine Zeichenfolge von text, sondern verlässt die Eingabe ohne Sie die AutoVervollständigen-Optionen, die kein Wert festgelegt ist, in die verdeckte Eingabe, selbst wenn die Zeichenfolge stimmt mit ein in das array.
So, mit Hilfe der anderen Antworten ich habe dieses: