Woher wissen Sie, dass eine Zeichenfolge in jQuery mit einer bestimmten Zeichenfolge beginnt / endet?


206

Ich möchte wissen, ob eine Zeichenfolge mit dem angegebenen Zeichen / der angegebenen Zeichenfolge beginnt oder in jQuery damit endet.

Beispielsweise:

var str = 'Hello World';

if( str starts with 'Hello' ) {
   alert('true');
} else {
   alert('false');
}

if( str ends with 'World' ) {
   alert('true');
} else {
   alert('false');
}

Wenn es keine Funktion gibt, dann eine Alternative?



2
Ja, oder verwenden Sie ES6 noch nicht, wenn Sie Benutzer haben, die einen IE verwenden, der älter als Edge ist.
— Antares42

Antworten:


388

Eine Möglichkeit besteht darin, reguläre Ausdrücke zu verwenden:

if (str.match("^Hello")) {
   // do this if begins with Hello
}

if (str.match("World$")) {
   // do this if ends in world
}

1
In jQuery habe ich versucht, str.startsWith ('einige Überprüfungszeichenfolgen ..'). Dies gab mir einen Fehler, der besagte, StartsWith-Methode nicht gefunden .. :( aber str.match hat funktioniert. Danke für Ihre Antwort
— Débora

2
Achten Sie nur darauf, dass die Zeichenfolge, die Sie überprüfen, keine für Regex reservierten Zeichen enthält.
— Nokturnal

23
Das Übergeben eines Regex-Objekts anstelle eines Regex-Strings scheint das Problem zu lösen, das @nokturnal erwähnt: str.match(/^Hello/)Aber das Formular /regex/.test(str)ist für diesen speziellen Fall noch besser, laut stackoverflow.com/questions/10940137/…
— CrazyPyro

Dies würde eine übereinstimmende Zeichenfolge zurückgeben, jedoch keinen booleschen Wert.
— RajKumar Samala

var isUnavailable = $("#StatusId option:selected").text().match("^Unavailable - ");- Warum wird null zurückgegeben, wenn die ausgewählte Option "Nicht verfügbar - Andere" lautet?
— egmfrs

96

Für den Start können Sie indexOf verwenden:

if(str.indexOf('Hello') == 0) {

...

ref

und Sie können die Mathematik basierend auf der Zeichenfolgenlänge durchführen, um 'Endswith' zu bestimmen.

if(str.lastIndexOf('Hello') == str.length - 'Hello'.length) {

11
Vielleicht möchten Sie lastIndexOf()für die Endswith verwenden;)
— Reigel

Achtung, IndexOf wird im IE8-Browser nicht unterstützt. Gleiches gilt für lastIndexOf.
— Pedro Lopes

1
Ich entschuldige mich für die Verwirrung. Ich bezog mich auf Array.prototype.indexOf (), das nur für iE9 + unterstützt wird, und nicht auf String.prototype.indexOf (), das IE4 + ist
— Pedro Lopes

3
Eine viel sicherere Antwort als die Verwendung regulärer Ausdrücke für einen so einfachen Anwendungsfall. Sollte wohl als Antwort akzeptiert werden.
— AntonChanning

1
Der Code für 'Endswith' ist fehlerhaft. Bei der Suche nach einer Zeichenfolge, die nicht in der Zeichenfolge enthalten ist und die Länge = (Wort - 1) hat. Z.B. ("1234".lastIndexOf('Hello') == "1234".length - 'Hello'.length)führt zu wahr.
— Nick Russler

23

Dazu ist jQuery nicht erforderlich. Sie könnten einen jQuery-Wrapper codieren, aber er wäre nutzlos, sodass Sie ihn besser verwenden sollten

var str = "Hello World";

window.alert("Starts with Hello ? " + /^Hello/i.test(str));        

window.alert("Ends with Hello ? " + /Hello$/i.test(str));

da die match () -Methode veraltet ist.

PS: Das "i" -Flag in RegExp ist optional und steht für Groß- und Kleinschreibung wird nicht berücksichtigt (daher wird es auch für "Hallo", "Hallo" usw. als "Wahr" zurückgegeben).


2
Können Sie einen Link zur Dokumentation zu match () bereitstellen, die veraltet ist? Eine schnelle Google-Suche gibt nichts zurück.
— Cavyn VonDeylen

1
Ich habe das vor ein paar Jahren online gelesen, ich fürchte, ich kann nicht mehr genau finden, wo.
— Sebastien P.

16

Sie benötigen jQuery für solche Aufgaben nicht wirklich. In der ES6-Spezifikation haben sie bereits sofort einsatzbereite Methoden Start mit und Ende mit .

var str = "To be, or not to be, that is the question.";
alert(str.startsWith("To be"));         // true
alert(str.startsWith("not to be"));     // false
alert(str.startsWith("not to be", 10)); // true

var str = "To be, or not to be, that is the question.";
alert( str.endsWith("question.") );  // true
alert( str.endsWith("to be") );      // false
alert( str.endsWith("to be", 19) );  // true

Derzeit in FF und Chrome verfügbar . Für alte Browser können Sie deren Polyfills oder Substr verwenden


10

Sie können den StringPrototyp jederzeit wie folgt erweitern:

//  Checks that string starts with the specific string
if (typeof String.prototype.startsWith != 'function') {
    String.prototype.startsWith = function (str) {
        return this.slice(0, str.length) == str;
    };
}

//  Checks that string ends with the specific string...
if (typeof String.prototype.endsWith != 'function') {
    String.prototype.endsWith = function (str) {
        return this.slice(-str.length) == str;
    };
}

Und benutze es so:

var str = 'Hello World';

if( str.startsWith('Hello') ) {
   // your string starts with 'Hello'
}

if( str.endsWith('World') ) {
   // your string ends with 'World'
}

2

ES6 unterstützt jetzt die Methode startsWith()und endsWith()zum Überprüfen von Anfang und Ende von strings. Wenn Sie Pre-Es6-Engines unterstützen möchten, sollten Sie dem StringPrototyp eine der vorgeschlagenen Methoden hinzufügen .

if (typeof String.prototype.startsWith != 'function') {
  String.prototype.startsWith = function (str) {
    return this.match(new RegExp("^" + str));
  };
}

if (typeof String.prototype.endsWith != 'function') {
  String.prototype.endsWith = function (str) {
    return this.match(new RegExp(str + "$"));
  };
}

var str = "foobar is not barfoo";
console.log(str.startsWith("foob"); // true
console.log(str.endsWith("rfoo");   // true

Jede Zeichenfolge, die Zeichen enthält, die für die Verwendung in einem regulären Ausdruck (z. B. ()[].) maskiert werden müssen, unterbricht Ihre Polyfill-Methoden. Sie müssen die Zeichenfolgen mit einer Regex-Escape-Funktion vorbereiten. Oder noch besser: Verwenden Sie eine kampferprobte Polyfüllung voncore-js
— nirazul
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.