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?

Naveed
quelle
Verwenden Sie neue ES6-Funktionen
Salvador Dali
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
}
Lukáš Lalinský
quelle
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) {
sje397
quelle
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).

Sebastien P.
quelle
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

Salvador Dali
quelle
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'
}
Mr. Pumpkin
quelle
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
16kb
quelle
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