1802 Stimmen

Wie prüft man, ob eine Zeichenkette "mit" einer anderen Zeichenkette beginnt?

Wie würde ich das Äquivalent zu C#s String.StartsWith in JavaScript?

var haystack = 'hello world';
var needle = 'he';

haystack.startsWith(needle) == true

Hinweis: Dies ist eine alte Frage, und wie in den Kommentaren erwähnt, führte ECMAScript 2015 (ES6) die .startsWith Methode. Zum Zeitpunkt der Erstellung dieser Aktualisierung (2015) Die Browserunterstützung ist noch lange nicht vollständig .

1854voto

Christian C. Salvadó Punkte 763569

Sie können die ECMAScript 6-Funktion String.prototype.startsWith() Methode, aber es ist noch nicht in allen Browsern unterstützt . Bei Browsern, die dies nicht unterstützen, müssen Sie ein Shim/Polyfill verwenden, um es hinzuzufügen. Erstellen einer Implementierung, die mit alle Details, die in der Spezifikation festgelegt sind ist ein wenig kompliziert. Wenn Sie eine treue Unterlegscheibe wollen, verwenden Sie eine von beiden:

Sobald Sie die Methode angepasst haben (oder wenn Sie nur Browser und JavaScript-Engines unterstützen, die bereits über diese Methode verfügen), können Sie sie wie folgt verwenden:

   console.log("Hello World!".startsWith("He")); // true

var haystack = "Hello world";
var prefix = 'orl';
console.log(haystack.startsWith(prefix)); // false

1 Stimmen

WARNUNG! Diese jsperf-Tests funktionieren nicht in Browsern, die gut mit JIT-Kompilierung umgehen können. Browsern wie Firefox und Chrome erkennen es manchmal, wenn das Ergebnis einer Operation verworfen wird, und führen die Operation deshalb nicht durch . Abgesehen davon verwenden moderne Javascript-Engines Branchenprognose Daher sollten die Teststrings bei jeder Iteration anders sein.

0 Stimmen

Hinweis: Wenn Typescript sich beschwert, wenn Sie versuchen, Ihr Projekt zu bauen, müssen Sie zumindest "es2015.core" im Lib-Array Ihrer tsconfig.json haben

1315voto

Mark Byers Punkte 761508

Eine weitere Alternative mit .lastIndexOf :

haystack.lastIndexOf(needle) === 0

Dieser blickt rückwärts durch haystack für ein Vorkommen von needle ausgehend von der Länge des Indexstrings von haystack zurück auf Null. Mit anderen Worten: Es wird nur geprüft, ob haystack beginnt mit needle . lastIndexOf bietet einen zweiten optionalen Parameter "fromIndex". Wenn er angegeben wird, beginnt die Rückwärtssuche an der angegebenen Indexposition und führt zurück zum Index Null. Es darf jedoch kein anderer fromIndex als der allerletzte Index angegeben werden, da sonst bei der Suche etwas übersehen werden könnte.

Im Prinzip sollte dies Leistungsvorteile gegenüber einigen anderen Ansätzen haben:

  • Sie durchsucht nicht die gesamte haystack .
  • Es wird keine neue temporäre Zeichenfolge erstellt und dann sofort verworfen.

1 Stimmen

Ich bin mir nicht sicher, von welchem Fall @rfcoder89 spricht - jsfiddle.net/jkzjw3w2/1

8 Stimmen

@rfcoder89 Beachten Sie den zweiten Parameter von lastIndexOf: "aba".lastIndexOf ("a") ist 2, wie Sie betonen, aber "aba".lastIndexOf ("a", 0) 0 ist, was korrekt ist

2 Stimmen

Ich danke Ihnen vielmals. String.startsWith funktioniert nicht auf Android Lollipop WebView, aber dieses lastIndexOf Snippet tut!!!

601voto

cobbal Punkte 68319
data.substring(0, input.length) === input

3 Stimmen

@ANeves Ich vermute, es hängt stark vom Browser und den verwendeten Daten ab. Siehe Ben Weavers Antwort für aktuelle Messungen. In dem Browser, den ich derzeit verwende (Chrome 12.0.742 unter Windows), gewinnt substring für den Erfolg und prepared regex für den Misserfolg.

4 Stimmen

@cobbal Vielleicht. Aber .lastIndexOf(input, 0) vergleicht die ersten N-Zeichen, während .substring(0, input.length) === input zählt N, unterteilt die Daten auf N Länge und vergleicht dann diese N Zeichen. Wenn es keine Code-Optimierung gibt, kann diese zweite Version nicht schneller sein als die andere. Verstehen Sie mich nicht falsch, aber ich würde niemals selbst etwas Besseres finden als das, was Sie vorgeschlagen haben :)

2 Stimmen

@ANeves Aber .lastIndexOf auf einer langen Zeichenkette, die false zurückgibt, iteriert über die gesamte Zeichenkette (O(N)), während der Fall .substring über eine potenziell viel kleinere Zeichenkette iteriert. Wenn Sie Mehrheitserfolge oder nur kleine Eingaben erwarten, ist .lastIndexOf wahrscheinlich schneller - ansonsten ist .substring wahrscheinlich schneller. Bei .substring besteht außerdem die Gefahr einer Ausnahme, wenn die Eingabe länger ist als die zu prüfende Zeichenkette.

186voto

Vincent Punkte 2923

Ohne eine Hilfsfunktion, nur mit regex's .test Methode:

/^He/.test('Hello world')

Um dies mit einer dynamischen Zeichenkette anstelle einer hartkodierten Zeichenkette zu tun (unter der Annahme, dass die Zeichenkette keine Regexp-Steuerzeichen enthalten wird):

new RegExp('^' + needle).test(haystack)

Sie sollten sich informieren über Gibt es eine RegExp.escape-Funktion in Javascript? wenn die Möglichkeit besteht, dass Regexp-Kontrollzeichen in der Zeichenkette erscheinen.

1 Stimmen

Um die Groß- und Kleinschreibung zu berücksichtigen, verwenden Sie /^he/i

78voto

mjs Punkte 19667

Beste Lösung:

function startsWith(str, word) {
    return str.lastIndexOf(word, 0) === 0;
}

Und hier ist endsWith wenn Sie das auch brauchen:

function endsWith(str, word) {
    return str.indexOf(word, str.length - word.length) !== -1;
}

Für diejenigen, die es vorziehen, den Prototyp in String:

String.prototype.startsWith || (String.prototype.startsWith = function(word) {
    return this.lastIndexOf(word, 0) === 0;
});

String.prototype.endsWith   || (String.prototype.endsWith = function(word) {
    return this.indexOf(word, this.length - word.length) !== -1;
});

Uso:

"abc".startsWith("ab")
true
"c".ensdWith("c") 
true

Mit Methode:

startsWith("aaa", "a")
true
startsWith("aaa", "ab")
false
startsWith("abc", "abc")
true
startsWith("abc", "c")
false
startsWith("abc", "a")
true
startsWith("abc", "ba")
false
startsWith("abc", "ab")
true

0 Stimmen

Ich glaube, Sie haben lastIndexOf und indexOf in Ihren Funktionen verwechselt - startsWith sollte return str.indexOf(word, 0) === 0 sein;

6 Stimmen

@RichardMatheson Das Problem bei der Verwendung von indexOf besteht darin, dass es, wenn die Suche am Anfang fehlschlägt, die gesamte Zeichenkette durchsucht, wobei lastIndexOf bei der Länge des Wortes beginnt und bis auf Null zurückgeht. Haben Sie es verstanden?

2 Stimmen

Ahh ja, das macht jetzt Sinn - ich habe nicht auf die Indizes geachtet, die Sie verwendet haben. Sehr schöner Trick!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X