Jak się dowiedzieć, że ciąg zaczyna się / kończy określonym łańcuchem w jQuery?

206

Chcę wiedzieć, czy ciąg zaczyna się od określonego znaku / ciągu, czy kończy się na nim w jQuery.

Na przykład:

var str = 'Hello World';

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

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

Jeśli nie ma żadnej funkcji, to jakaś alternatywa?

Naveed
źródło
Skorzystaj z nowych funkcji ES6
Salvador Dali,
2
Tak, cóż, lub nie używaj jeszcze ES6, jeśli masz użytkowników, którzy używają IE starszego niż Edge.
Antares42,

Odpowiedzi:

388

Jedną z opcji jest użycie wyrażeń regularnych:

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

if (str.match("World$")) {
   // do this if ends in world
}
Lukáš Lalinský
źródło
1
w jQuery wypróbowałem str.startsWith ('some sprawdzanie ciągu ..'), to dało mi komunikat o błędzie: opensWith metoda nie została znaleziona .. :( ale str.match zadziałało. Dzięki za odpowiedź
Débora
2
Uważaj tylko, aby sprawdzany ciąg znaków nie zawiera żadnych znaków zastrzeżonych wyrażeń regularnych.
nokturnal
23
Przekazywanie obiektu wyrażenia regularnego zamiast ciągu wyrażenia regularnego wydaje się rozwiązać problem, o którym wspomina @nokturnal: str.match(/^Hello/)Ale forma /regex/.test(str)jest jeszcze lepsza w tym konkretnym przypadku, według stackoverflow.com/questions/10940137/…
CrazyPyro
Zwróci to dopasowany ciąg, ale nie wartość logiczną.
RajKumar Samala,
var isUnavailable = $("#StatusId option:selected").text().match("^Unavailable - ");- dlaczego ta wartość jest zerowa, gdy wybrana opcja to „Niedostępne - inne”?
egmfrs,
96

Na początek możesz użyć indexOf:

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

...

ref

i możesz wykonać matematykę na podstawie długości łańcucha, aby określić „koniec z”.

if(str.lastIndexOf('Hello') == str.length - 'Hello'.length) {
sje397
źródło
11
możesz użyć lastIndexOf()do końców;)
Reigel
Ostrożnie, IndexOf nie jest obsługiwany w przeglądarce IE8. To samo z lastIndexOf.
Pedro Lopes,
1
Przepraszam za zamieszanie. Miałem na myśli Array.prototype.indexOf (), który jest obsługiwany tylko dla iE9 +, a nie String.prototype.indexOf (), czyli IE4 +
Pedro Lopes
3
O wiele bezpieczniejsza odpowiedź niż używanie wyrażeń regularnych w tak prostym przypadku użycia. Prawdopodobnie należy przyjąć odpowiedź.
AntonChanning
1
Kod „ends with” jest wadliwy. Podczas sprawdzania łańcucha, który nie pojawia się w ciągu i ma długość = (słowo - 1). Np. ("1234".lastIndexOf('Hello') == "1234".length - 'Hello'.length)daje w wyniku prawda.
Nick Russler,
23

Nie ma potrzeby wykonywania tego przez jQuery. Możesz kodować opakowanie jQuery, ale byłoby to bezużyteczne, więc powinieneś lepiej go używać

var str = "Hello World";

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

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

ponieważ metoda match () jest przestarzała.

PS: flaga „i” w RegExp jest opcjonalna i oznacza wielkość liter bez rozróżniania wielkości liter (więc zwróci również prawdę dla „hello”, „hEllo” itp.).

Sebastien P.
źródło
2
Czy możesz podać link do przestarzałej dokumentacji dotyczącej match ()? Szybkie wyszukiwanie w Google nic nie zwraca.
Cavyn VonDeylen,
1
Przeczytałem to online kilka lat temu, obawiam się, że nie mogę już znaleźć gdzie dokładnie.
Sebastien P.,
16

Tak naprawdę nie potrzebujesz jQuery do takich zadań. W specyfikacji ES6 mają już gotowe metody zaczynające się i kończące .

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

Obecnie dostępne w FF i Chrome . W przypadku starszych przeglądarek możesz użyć ich wypełniaczy lub substratu

Salvador Dali
źródło
10

Zawsze możesz przedłużyć Stringprototyp w ten sposób:

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

I użyj tego w ten sposób:

var str = 'Hello World';

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

if( str.endsWith('World') ) {
   // your string ends with 'World'
}
Pan Dynia
źródło
2

ES6 obsługuje teraz metodę startsWith()i endsWith()do sprawdzania początku i końca strings. Jeśli chcesz obsługiwać silniki starsze niż ES6, możesz rozważyć dodanie jednej z sugerowanych metod do Stringprototypu.

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
źródło
Dowolny ciąg znaków zawierający znaki, które muszą być poprzedzone znakami ucieczki w celu użycia w wyrażeniu regularnym (na przykład ()[]. poprzedzone znakiem ), spowoduje uszkodzenie metod wypełniania. Musisz przygotować ciągi znaków z funkcją ucieczki wyrażenia regularnego. Lub jeszcze lepiej: użyj sprawdzonego w bitwie polifillu zcore-js
nirazul