JavaScript- oder jQuery-Zeichenfolge endet mit der Dienstprogrammfunktion


Antworten:


153

Sie könnten Regexps wie folgt verwenden:

str.match(/value$/)

Dies würde true zurückgeben, wenn der String am Ende 'value' ($) hat.


1
Fehlertest: Wert = "Test [az]". Andernfalls: 'test [az]'. Match (/ [az] $ /) gibt "null" zurück
gmunkhbaatarmn

Normalerweise nehme ich das Regex-Tool nicht zuerst aus meiner Tasche, aber dies übertrifft alle Alternativen (String # endetWith wird nativ nur in Firefox unterstützt, und das Erweitern / Verwenden von Js von Drittanbietern ist etwas übertrieben)
Diclophis

1
match () gibt keinen Booleschen Wert zurück. 'foobar'.match (/ bar $ /) gibt ["bar"] zurück
Jonathan.Brink

1
RegEx Search () anstelle von Match () wäre eine bessere Option, wenn wir nur ein boolesches Ergebnis wünschen. Search () gibt -1 zurück, wenn keine gefunden wird. if (str.search (/ value $ /)! = -1) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
mitaka

39

Von Prototypen gestohlen:

String.prototype.endsWith = function(pattern) {
    var d = this.length - pattern.length;
    return d >= 0 && this.lastIndexOf(pattern) === d;
};

'slaughter'.endsWith('laughter');
// -> true

5
Einige Leute glauben, dass das Modifizieren des Prototyps einer Kernklasse etwas ist, das Sie nicht tun sollten - Crockford bezeichnet dies in seinem Buch JavaScript: The Good Parts als "globale Reduzierung".
Walter Rumsby

4
Warum solltest du es nicht tun? Oder machst du es einfach nicht, weil Crockford es gesagt hat?
Luca Matteis

11
Sie sollten dies nicht tun, da nicht garantiert wird, dass es in allen Implementierungen von JS funktioniert: Die ECMAScript Compact Profile-Spezifikation (ECMA-327: ecma-international.org/publications/standards/Ecma-327.htm ) gibt an, dass "Compact "Implementierungen (z. B. auf Handheld-Geräten wie Telefonen) müssen dies nicht unterstützen (siehe Abschnitt 5.2). Selbst wenn Sie davon nicht betroffen sind, ist es durchaus möglich, dass neuere Versionen von JS beschädigt werden: Beispielsweise bricht jeder, der in der Vergangenheit Code bereitgestellt hat, der Array.prototype eine "forEach" -Methode hinzufügt, jetzt die native Implementierung in neueren Versionen von Firefox.
NickFitz

3
Wenn jemand String nicht ändern möchte, kann er ihn sehr einfach in eine eigenständige Funktion verwandeln.
Studgeek


5

Ich hatte kein Glück mit dem Match-Ansatz, aber das hat funktioniert:

Wenn Sie die Zeichenfolge haben, "Dies ist meine Zeichenfolge." und wollte sehen, ob es mit einem Punkt endet, tun Sie dies:

var myString = "This is my string.";
var stringCheck = ".";
var foundIt = (myString.lastIndexOf(stringCheck) === myString.length - stringCheck.length) > 0;
alert(foundIt);

Sie können die Variable stringCheck so ändern, dass sie eine beliebige Zeichenfolge ist, nach der gesucht werden soll. Besser noch wäre es, dies in deine eigene Funktion wie folgt zu werfen:

function DoesStringEndWith(myString, stringCheck)
{
    var foundIt = (myString.lastIndexOf(stringCheck) === myString.length - stringCheck.length) > 0;
    return foundIt;
}

1
Wirklich schön, @theJerm. Dies funktionierte für mich in verschiedenen Situationen, während .match dies nicht immer tat.
Nathan

5

Das kannst du machen 'hello world'.slice(-5)==='world'. Funktioniert in allen Browsern. Viel schneller als Regex.



1

Ich erweitere nur das, was @ luca-matteis gepostet hat, aber um die in den Kommentaren genannten Probleme zu lösen, sollte der Code umbrochen werden, um sicherzustellen, dass Sie eine native Implementierung nicht überschreiben.

if ( !String.prototype.endsWith ) {  
    String.prototype.endsWith = function(pattern) {
        var d = this.length - pattern.length;
        return d >= 0 && this.lastIndexOf(pattern) === d;
    };
}

Dies ist die vorgeschlagene Methode für die Methode Array.prototype.forEach, auf die im Mozilla-Entwicklernetzwerk hingewiesen wird


0

Sie können jederzeit einen Prototyp einer String-Klasse erstellen. Dies funktioniert:

String.prototype.endsWith = function (str) {return (this.match (str + "$") == str)}

Weitere verwandte Erweiterungen für die String-Klasse finden Sie unter http://www.tek-tips.com/faqs.cfm?fid=6620


2
Dies schlägt fehl, wenn str spezielle reguläre Ausdruckszeichen enthält, z. B. "[ssss]".
Studgeek

Dies schlägt auch fehl, weil matchein Array zurückgegeben wird. Es müsste sein this.match(str+"$")[0]===str(und das könnte scheitern, wenn matchnichts gefunden wird - habe diesen nicht falsch getestet).
TLS
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.