endetMit in JavaScript

Lesezeit: 5 Minuten

endetMit in JavaScript
Phani Kumar Bhamidipati

Wie kann ich in JavaScript prüfen, ob eine Zeichenfolge 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 es überprüfen?

  1. Gibt es eine endsWith() Methode in JavaScript?

  2. Eine Lösung, die ich habe, ist, die Länge der Zeichenfolge zu nehmen und das letzte Zeichen zu erhalten und es zu überprüfen.

Ist das der beste Weg oder gibt es einen anderen Weg?

endetMit in JavaScript
Mike Samuel

/#$/.test(str)

funktioniert auf allen Browsern, erfordert kein Monkey-Patching Stringund erfordert nicht das Scannen der gesamten Zeichenfolge als lastIndexOf tut, wenn es keine Übereinstimmung gibt.

Wenn Sie eine konstante Zeichenfolge abgleichen möchten, die möglicherweise Sonderzeichen für reguläre Ausdrücke enthält, z '$'dann können Sie Folgendes verwenden:

function makeSuffixRegExp(suffix, caseInsensitive) {
  return new RegExp(
      String(suffix).replace(/[$%()*+.?\[\\\]{|}]/g, "\\$&") + "$",
      caseInsensitive ? "i" : "");
}

und dann kannst du es so verwenden

makeSuffixRegExp("a[complicated]*suffix*").test(str)

  • Das ist schön und einfach, wenn Sie nach einer konstanten Teilzeichenfolge suchen.

    – Warren Blanchet

    21. Mai 2009 um 22:50 Uhr

  • lastIndexOf scannt die gesamte Zeichenfolge? Ich dachte, es würde vom Ende bis zum Anfang suchen.

    – Der Student

    19. April 2011 um 16:45 Uhr


  • @TomBrito, lastIndexOf scannt die gesamte Zeichenfolge nur, wenn keine Übereinstimmung gefunden wird oder eine Übereinstimmung am Anfang gefunden wird. Wenn es am Ende eine Übereinstimmung gibt, funktioniert es proportional zur Länge des Suffixes. Jawohl, /asdf$/.test(str) liefert true when str endet mit "asdf".

    – Mike Samuel

    19. April 2011 um 16:59 Uhr

  • @Tom Brito, es ist ein Literal für reguläre Ausdrücke. Die Syntax ist von Perl entlehnt. Sehen developer.mozilla.org/en/Core_JavaScript_1.5_Guide/… oder für unnötige Details siehe Abschnitt 7.8.5 der EcmaScript-Sprachspezifikation.

    – Mike Samuel

    20. April 2011 um 16:21 Uhr

  • +1 für die Cross-Browser-Kompatibilität. Getestet auf Chrome 28.0.1500.72 m, Firefox 22.0 und IE9.

    – Adrien Be

    18. Juli 2013 um 15:06 Uhr

  • @Anthony, ähm … also benutze .Length-1, was ist das Problem? if (mystring.substr(mystring.length-1) === “#”) {} funktioniert gut im IE.

    – BrainSlugs83

    20. September 2011 um 22:47 Uhr

  • @BrainSlugs83 – genau das ist das Problem: Die ‘.length-1’-Syntax funktioniert im IE und die ‘-1’-Syntax nicht. Es ist etwas zu beachten, also +1 an Anthony für den Tipp.

    – awramov

    13. November 2011 um 18:11 Uhr

  • Könntest du nicht verwenden slice()? Es funktioniert für mich in meinem schnellen IE7-Test.

    – Alex

    8. Februar 2012 um 23:00 Uhr

  • verrücktes IE. wann wird es sterben?

    – ahnbizcad

    12. April 2016 um 21:06 Uhr

  • @ahnbizcad Deine Gebete wurden jetzt erhört. RIP IE

    – Sankara

    20. Juli 2021 um 13:31 Uhr

1646355308 604 endetMit in JavaScript
Oskar Liljeblad

Komm schon, das ist das Richtige endsWith Implementierung:

String.prototype.endsWith = function (s) {
  return this.length >= s.length && this.substr(this.length - s.length) == s;
}

verwenden lastIndexOf erzeugt nur unnötige CPU-Schleifen, wenn es keine Übereinstimmung gibt.

  • Einverstanden. Ich habe wirklich das Gefühl, dass dies die leistungsfähigste Lösung ist, die angeboten wird, da sie frühe Abbrüche/Zuverlässigkeitsprüfungen enthält, kurz und prägnant ist, elegant ist (den String-Prototypen überlädt) und Teilzeichenfolgen viel weniger als Ressourcentreffer erscheinen als das Hochfahren der Regex-Engine.

    – BrainSlugs83

    20. September 2011 um 22:52 Uhr

  • Gefällt mir auch diese Lösung. Nur der Funktionsname ist falsch geschrieben. Sollte “endsWith” sein.

    – xmedeko

    12. Oktober 2011 um 12:23 Uhr


  • @BrainSlugs83 Es ist ein paar Jahre her, aber jetzt ist diese Methode nicht schneller als die oben von Chakrit erwähnte Methode „indexOf“, und unter Safari ist sie 30 % langsamer! Hier ist ein jsPerf-Test für den Fehlerfall über eine Zeichenfolge mit etwa 50 Zeichen: jsperf.com/endswithcomparison

    – Brent Faust

    5. Dezember 2011 um 23:28 Uhr


  • Sollte wahrscheinlich verwenden === obwohl.

    – Timmm

    10. November 2014 um 14:25 Uhr

Diese Version vermeidet das Erstellen einer Teilzeichenfolge und verwendet keine regulären Ausdrücke (einige Regex-Antworten hier funktionieren; andere sind defekt):

String.prototype.endsWith = function(str)
{
    var lastIndex = this.lastIndexOf(str);
    return (lastIndex !== -1) && (lastIndex + str.length === this.length);
}

Wenn Ihnen Leistung wichtig ist, lohnt es sich zu testen, ob lastIndexOf ist tatsächlich schneller als das Erstellen einer Teilzeichenfolge oder nicht. (Es kann durchaus von der JS-Engine abhängen, die Sie verwenden …) Es kann im passenden Fall und bei einer kleinen Zeichenfolge schneller sein – aber wenn die Zeichenfolge sehr groß ist, muss es sogar durch das Ganze zurückblicken obwohl uns das egal ist 🙁

Um ein einzelnes Zeichen zu prüfen, die Länge zu finden und dann zu verwenden charAt ist wahrscheinlich der beste Weg.

  • Einverstanden. Ich habe wirklich das Gefühl, dass dies die leistungsfähigste Lösung ist, die angeboten wird, da sie frühe Abbrüche/Zuverlässigkeitsprüfungen enthält, kurz und prägnant ist, elegant ist (den String-Prototypen überlädt) und Teilzeichenfolgen viel weniger als Ressourcentreffer erscheinen als das Hochfahren der Regex-Engine.

    – BrainSlugs83

    20. September 2011 um 22:52 Uhr

  • Gefällt mir auch diese Lösung. Nur der Funktionsname ist falsch geschrieben. Sollte “endsWith” sein.

    – xmedeko

    12. Oktober 2011 um 12:23 Uhr


  • @BrainSlugs83 Es ist ein paar Jahre her, aber jetzt ist diese Methode nicht schneller als die oben von Chakrit erwähnte Methode „indexOf“, und unter Safari ist sie 30 % langsamer! Hier ist ein jsPerf-Test für den Fehlerfall über eine Zeichenfolge mit etwa 50 Zeichen: jsperf.com/endswithcomparison

    – Brent Faust

    5. Dezember 2011 um 23:28 Uhr


  • Sollte wahrscheinlich verwenden === obwohl.

    – Timmm

    10. November 2014 um 14:25 Uhr

1646355308 82 endetMit in JavaScript
Nikita Kokscharow

Ansatz mit nicht gesehen slice Methode. Also belasse ich es einfach hier:

function endsWith(str, suffix) {
    return str.slice(-suffix.length) === suffix
}

  • Sie können es noch etwas vereinfachen: return str.slice(-1) === suffix;

    – Erik K.

    10. November 2015 um 14:45 Uhr

  • Dies ist die beste Antwort. Ich bin mir nicht sicher, warum es nicht mehr Upvotes hat.

    – Nuklearflut

    27. Juli 2016 um 15:22 Uhr

929250cookie-checkendetMit in JavaScript

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy