Wie kann ich überprüfen, ob eine Zeichenfolge in JavaScript mit einem bestimmten Zeichen endet?
Beispiel: Ich habe eine Zeichenfolge
var str = "mystring#";
Ich möchte wissen, ob diese Zeichenfolge mit endet #
. Wie kann ich das überprüfen?
Gibt es eine
endsWith()
Methode in JavaScript?Eine Lösung, die ich habe, besteht darin, die Länge der Zeichenfolge zu nehmen, das letzte Zeichen zu erhalten und es zu überprüfen.
Ist das der beste Weg oder gibt es einen anderen Weg?
javascript
string
ends-with
Bobby Kumar
quelle
quelle
String.prototype.endsWith
.Antworten:
UPDATE (24. November 2015):
Diese Antwort wurde ursprünglich im Jahr 2010 (vor sechs Jahren) veröffentlicht. Bitte beachten Sie diese aufschlussreichen Kommentare:
Shauna - Update für Googler - ECMA6 fügt diese Funktion hinzu. Der MDN-Artikel zeigt auch eine Polyfüllung. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
TJ Crowder - Das Erstellen von Teilzeichenfolgen ist in modernen Browsern nicht teuer. Möglicherweise war es 2010, als diese Antwort veröffentlicht wurde.
this.substr(-suffix.length) === suffix
Heutzutage ist der einfache Ansatz in Chrome am schnellsten, in IE11 genauso wie in indexOf und in Firefox nur 4% langsamer (Fergetaboutit-Gebiet): jsperf.com/endswith-stackoverflow/14 Und auf ganzer Linie schneller, wenn das Ergebnis falsch ist: jsperf.com/endswith-stackoverflow-when-false Natürlich ist der Punkt mit ES6, der Enden hinzufügt, umstritten. :-)URSPRÜNGLICHE ANTWORT:
Ich weiß, dass dies eine einjährige Frage ist ... aber ich brauche sie auch und sie muss browserübergreifend funktionieren, also ... die Antworten und Kommentare aller kombinieren und ein wenig vereinfachen:
indexOf
Funktion für schnellste ErgebnisseindexOf
, um fortzufahrenWenn Sie es nicht mögen, Dinge in die Prototypen der nativen Datenstruktur zu stopfen, finden Sie hier eine eigenständige Version:
BEARBEITEN: Wie von @hamish in den Kommentaren erwähnt, können Sie, wenn Sie auf der sicheren Seite irren und prüfen möchten, ob bereits eine Implementierung bereitgestellt wurde, einfach eine
typeof
Prüfung wie folgt hinzufügen :quelle
this.substr(-suffix.length) === suffix
Heutzutage ist der einfache Ansatz in Chrome am schnellsten, in IE11 derselbeindexOf
und in Firefox nur 4% langsamer (Fergetaboutit-Gebiet): jsperf.com/endswith-stackoverflow/14 Und auf der ganzen Linie schneller, wenn das Ergebnis falsch ist: jsperf .com / endswith-stackoverflow-when-false NatürlichendsWith
ist der Punkt beim Hinzufügen von ES6 umstritten . :-)funktioniert in allen Browsern, erfordert kein Affen-Patching
String
und erfordert nicht das Scannen der gesamten Zeichenfolge, wie dies derlastIndexOf
Fall ist, wenn keine Übereinstimmung vorliegt.Wenn Sie mit einer konstanten Zeichenfolge übereinstimmen möchten, die möglicherweise Sonderzeichen für reguläre Ausdrücke enthält, z. B.
'$'
, können Sie Folgendes verwenden:und dann können Sie es so verwenden
quelle
lastIndexOf
scannt die gesamte Zeichenfolge nur, wenn keine Übereinstimmung gefunden wird oder wenn am Anfang eine Übereinstimmung gefunden wird. Wenn am Ende eine Übereinstimmung vorliegt, funktioniert diese proportional zur Länge des Suffix. Ja,/asdf$/.test(str)
ergibt wahr, wenn mitstr
endet"asdf"
.if( "mystring#".substr(-1) === "#" ) {}
quelle
slice()
? Es funktioniert für mich in meinem schnellen IE7-Test.Komm schon, das ist die richtige
endsWith
Implementierung:Die Verwendung von
lastIndexOf
erzeugt nur unnötige CPU-Schleifen, wenn keine Übereinstimmung vorliegt.quelle
===
.Diese Version vermeidet das Erstellen eines Teilstrings und verwendet keine regulären Ausdrücke (einige Regex-Antworten hier funktionieren; andere sind fehlerhaft):
Wenn Ihnen die Leistung wichtig ist, sollten Sie testen, ob sie
lastIndexOf
tatsächlich schneller ist als das Erstellen eines Teilstrings. (Es kann durchaus von der JS-Engine abhängen, die Sie verwenden ...) Im passenden Fall kann es durchaus schneller sein, und wenn die Zeichenfolge klein ist - aber wenn die Zeichenfolge groß ist, muss sie sogar das Ganze noch einmal durchsehen obwohl es uns eigentlich egal ist :(Um ein einzelnes Zeichen zu überprüfen,
charAt
ist es wahrscheinlich der beste Weg , die Länge zu finden und dann zu verwenden .quelle
str+"$"
sind und als reguläre Ausdrücke verwendet werden sollen, sind fehlerhaft, da sie möglicherweise keine gültigen regulären Ausdrücke sind.Ansatz mit
slice
Methode nicht gesehen. Also lasse ich es einfach hier:quelle
funktioniert nicht in dem Fall, in dem die ursprüngliche Zeichenfolgenlänge um eins kleiner als die Länge der Suchzeichenfolge ist und die Suchzeichenfolge nicht gefunden wird:
lastIndexOf gibt -1 zurück, dann fügen Sie die Länge der Suchzeichenfolge hinzu und die Länge der ursprünglichen Zeichenfolge bleibt erhalten.
Eine mögliche Lösung ist
quelle
Von developer.mozilla.org String.prototype.endsWith ()
Zusammenfassung
Die
endsWith()
Methode bestimmt, ob eine Zeichenfolge mit den Zeichen einer anderen Zeichenfolge endet, und gibt je nach Bedarf true oder false zurück.Syntax
Parameter
searchString : Die Zeichen, nach denen am Ende dieser Zeichenfolge gesucht werden soll.
Position : Suchen Sie in dieser Zeichenfolge, als wäre diese Zeichenfolge nur so lang. Der Standardwert ist die tatsächliche Länge dieser Zeichenfolge, die innerhalb des durch die Länge dieser Zeichenfolge festgelegten Bereichs geklemmt wird.
Beschreibung
Mit dieser Methode können Sie bestimmen, ob eine Zeichenfolge mit einer anderen Zeichenfolge endet oder nicht.
Beispiele
Spezifikationen
ECMAScript-Sprachspezifikation 6. Ausgabe (ECMA-262)
Browser-Kompatibilität
quelle
-- Oder --
quelle
ich hoffe das hilft
der traditionelle Weg
quelle
Ich weiß nichts über dich, aber:
Warum reguläre Ausdrücke? Warum mit dem Prototyp herumspielen? substr? Komm schon...
quelle
Nur eine weitere schnelle Alternative, die mit Regex wie ein Zauber für mich funktioniert hat:
quelle
Wenn Sie lodash verwenden :
Wenn Sie lodash nicht verwenden, können Sie es von seiner Quelle ausleihen .
quelle
Ich habe gerade von dieser String-Bibliothek erfahren:
http://stringjs.com/
Fügen Sie die js-Datei ein und verwenden Sie die
S
Variable wie folgt :Es kann auch in NodeJS verwendet werden, indem es installiert wird:
Dann benötigen Sie es als
S
Variable:Die Webseite enthält auch Links zu alternativen Zeichenfolgenbibliotheken, falls Sie dies nicht möchten.
quelle
quelle
So viele Dinge für ein so kleines Problem, verwenden Sie einfach diesen regulären Ausdruck
quelle
Es ist viele Jahre her für diese Frage. Lassen Sie mich ein wichtiges Update für die Benutzer hinzufügen, die die Antwort des am meisten bewerteten Chakrits verwenden möchten.
Die Funktionen 'Enden mit' wurden bereits als Teil von ECMAScript 6 (experimentelle Technologie) zu JavaScript hinzugefügt.
Verweisen Sie hier: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
Daher wird dringend empfohlen, die in der Antwort erwähnte Überprüfung auf das Vorhandensein einer nativen Implementierung hinzuzufügen.
quelle
quelle
Eine Möglichkeit zur Zukunftssicherung und / oder zum Verhindern des Überschreibens eines vorhandenen Prototyps wäre eine Testprüfung, um festzustellen, ob dieser bereits zum String-Prototyp hinzugefügt wurde. Hier ist meine Sicht auf die hoch bewertete Version ohne Regex.
quelle
if (!String.prototype.hasOwnProperty("endsWith"))
ist der beste Weg. Mittypeof
"MooTools und einige der anderen AJAX-Bibliotheken werden Sie vermasseln", laut "Crockford on JavaScript - Level 7: ECMAScript 5: Die neuen Teile", um 15:50 min.Die akzeptierte Antwort von @ chakrit ist eine solide Möglichkeit, dies selbst zu tun. Wenn Sie jedoch nach einer Paketlösung suchen, empfehlen wir Ihnen, einen Blick auf underscore.string zu werfen, wie @mlunoe hervorhob. Bei Verwendung von underscore.string lautet der Code:
quelle
Wenn Sie lasIndexOf oder substr nicht verwenden möchten, sehen Sie sich den String einfach in seinem natürlichen Zustand an (z. B. ein Array).
oder als eigenständige Funktion
quelle
quelle
Nach all den langen Antworten fand ich diesen Code einfach und leicht zu verstehen!
quelle
Dies ist die Implementierung von EndsWith:
String.prototype.endsWith = function (str) { return this.length >= str.length && this.substr(this.length - str.length) == str; }
quelle
Dies ist die Implementierung von
endsWith
:quelle
Dies baut auf der akzeptierten Antwort von @ charkit auf, sodass entweder ein Array von Zeichenfolgen oder eine Zeichenfolge als Argument übergeben werden kann.
Dies erfordert Unterstriche - kann aber wahrscheinlich angepasst werden, um die Unterstrichabhängigkeit zu entfernen.
quelle
_.str.endsWith
Leistungen:
quelle
Verwenden Sie keine regulären Ausdrücke. Sie sind selbst in schnellen Sprachen langsam. Schreiben Sie einfach eine Funktion, die das Ende einer Zeichenfolge überprüft. Diese Bibliothek hat schöne Beispiele: groundjs / util.js . Seien Sie vorsichtig, wenn Sie String.prototype eine Funktion hinzufügen. Dieser Code enthält nette Beispiele dafür: groundjs / prototype.js Im Allgemeinen ist dies eine nette Bibliothek auf Sprachebene : groundjs Sie können sich auch lodash ansehen
quelle
Alle von ihnen sind sehr nützliche Beispiele. Hinzufügen
String.prototype.endsWith = function(str)
hilft uns, die Methode einfach aufzurufen, um zu überprüfen, ob unsere Zeichenfolge damit endet oder nicht. Nun, Regexp wird es auch tun.Ich habe eine bessere Lösung gefunden als meine. Vielen Dank an alle.
quelle
Für Coffeescript
quelle