Frage Wie überprüft man, ob eine Zeichenfolge "StartsWith" eine andere Zeichenfolge?


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

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

//haystack.startsWith(needle) == true

Hinweis: Dies ist eine alte Frage, und wie bereits in den Kommentaren ECMAScript 2015 (ES6) erwähnt, wurde der .startsWith Methode. Zum Zeitpunkt der Erstellung dieses Updates (2015) Browser-Unterstützung ist bei weitem nicht abgeschlossen.


1547
2018-03-14 20:12


Ursprung


Antworten:


Sie können ECMAScript 6 verwenden String.prototype.startsWith() Methode, aber es ist noch nicht in allen Browsern unterstützt. Sie sollten ein Shim / Polyfill verwenden, um es in Browsern hinzuzufügen, die es nicht unterstützen. Erstellen einer Implementierung, die mit alle Details in der Spezifikation ausgelegt ist ein wenig kompliziert, und die in dieser Antwort definierte Version wird nicht ausreichen; Wenn du eine treue Unterlegscheibe möchtest, verwende entweder:

Sobald Sie die Methode geändert 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:

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

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

1655
2018-03-14 20:19



Eine andere Alternative mit .lastIndexOf:

haystack.lastIndexOf(needle, 0) === 0

Das sieht rückwärts durch haystack für ein Auftreten von needle ausgehend vom Index 0 von haystack. Mit anderen Worten, es prüft nur, ob haystack beginnt mit needle.

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

  • Es sucht nicht das Ganze haystack.
  • Es wird keine neue temporäre Zeichenfolge erstellt und dann sofort verworfen.

1226
2018-01-02 16:14



data.substring(0, input.length) === input

569
2018-03-14 20:14



Ohne eine Hilfsfunktion, nur Regex verwenden .test Methode:

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

Um dies mit einer dynamischen Zeichenfolge anstelle einer fest codierten Zeichenfolge zu tun (vorausgesetzt, die Zeichenfolge enthält keine regulären Steuerzeichen):

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

Sie sollten auschecken Gibt es in Javascript eine RegExp.escape-Funktion? Wenn die Möglichkeit besteht, dass Regexp-Steuerzeichen in der Zeichenfolge angezeigt werden.


180
2018-01-04 00:59



Ich wollte nur meine Meinung dazu sagen.

Ich denke, wir können es einfach so benutzen:

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

if (haystack.indexOf(needle) == 0) {
  // Code if string starts with this substring
}

50
2018-02-12 14:47



Beste Lösung:

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

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

Und hier ist es endet mit Wenn Sie das auch brauchen:

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

Für diejenigen, die es vorziehen, es in String zu prototypieren: 

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;
});

Verwendung: 

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

42
2018-04-26 21:56



Hier ist eine kleine Verbesserung der CMS-Lösung:

if(!String.prototype.startsWith){
    String.prototype.startsWith = function (str) {
        return !this.indexOf(str);
    }
}

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

 var data = "Hello world";
 var input = 'He';
 data.startsWith(input); // true

Überprüfen, ob die Funktion bereits existiert, falls ein zukünftiger Browser sie in nativem Code implementiert oder wenn sie von einer anderen Bibliothek implementiert wird. Zum Beispiel implementiert die Prototypbibliothek diese Funktion bereits.

Verwenden ! ist etwas schneller und prägnanter als === 0 obwohl nicht so lesbar.


37
2018-05-27 02:54



Überprüfen Sie auch unterstreich.string.js. Es enthält eine Reihe nützlicher Methoden zum Testen und Bearbeiten von Strings, einschließlich a startsWith Methode. Aus den Dokumenten:

beginnt mit  _.startsWith(string, starts)

Diese Methode prüft, ob string beginnt mit starts.

_("image.gif").startsWith("image")
=> true

21
2018-05-31 18:29



Ich habe mich kürzlich dieselbe Frage gestellt.
Es gibt mehrere mögliche Lösungen, hier sind 3 gültige:

  • s.indexOf(starter) === 0
  • s.substr(0,starter.length) === starter
  • s.lastIndexOf(starter, 0) === 0 (Nach dem Besuch von Mark Byers hinzugefügt Antworten)
  • mit einer Schleife:

    function startsWith(s,starter) {
      for (var i = 0,cur_c; i < starter.length; i++) {
        cur_c = starter[i];
        if (s[i] !== starter[i]) {
          return false;
        }
      }
      return true;
    }
    

Ich bin nicht auf die letzte Lösung gestoßen, die eine Schleife benutzt.
Überraschenderweise übertrifft diese Lösung die ersten 3 um ein Vielfaches.
Hier ist der Jsperf-Test, den ich durchgeführt habe, um zu dieser Schlussfolgerung zu kommen: http://jsperf.com/startswith2/2

Frieden

ps: ecmascript 6 (harmony) führt ein natives ein startsWith Methode für Zeichenfolgen.
Denken Sie nur daran, wie viel Zeit eingespart worden wäre, wenn Sie daran gedacht hätten, diese dringend benötigte Methode in die ursprüngliche Version aufzunehmen.

Aktualisieren

Wie Steve darauf hingewiesen hat (der erste Kommentar zu dieser Antwort), wird die obige benutzerdefinierte Funktion einen Fehler ausgeben, wenn das gegeben ist Präfix ist kürzer als die ganze Saite. Er hat das korrigiert und eine Loop-Optimierung hinzugefügt, die man sich ansehen kann http://jsperf.com/startswith2/4.

Beachten Sie, dass es 2 Optimierungen von Schleifen gibt, die Steve miteinbezog, die erste der beiden zeigte eine bessere Leistung, daher werde ich diesen Code unten posten:

function startsWith2(str, prefix) {
  if (str.length < prefix.length)
    return false;
  for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --i)
    continue;
  return i < 0;
}

15
2018-05-17 09:07



Da dies so populär ist, ist es meiner Meinung nach wichtig, darauf hinzuweisen, dass es in ECMA 6 eine Implementierung für diese Methode gibt und in Vorbereitung darauf, dass man die "offizielle" Polyfill verwenden sollte, um zukünftige Probleme und Tränen zu vermeiden.

Zum Glück liefern uns die Experten von Mozilla einen:

https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith

if (!String.prototype.startsWith) {
    String.prototype.startsWith = function(searchString, position) {
        position = position || 0;
        return this.indexOf(searchString, position) === position;
    };
}

Beachten Sie, dass dies den Vorteil hat, beim Übergang zu ECMA 6 ordnungsgemäß ignoriert zu werden.


10
2018-01-05 11:34