Jak mogę sprawdzić, czy ciąg znaków kończy się określonym znakiem w JavaScript?
Przykład: Mam ciąg
var str = "mystring#";
Chcę wiedzieć, czy ten ciąg się kończy #
. Jak mogę to sprawdzić?
Czy
endsWith()
w JavaScript jest metoda?Jednym z moich rozwiązań jest wzięcie długości łańcucha, pobranie ostatniego znaku i sprawdzenie go.
Czy to najlepszy sposób, czy jest jakiś inny sposób?
javascript
string
ends-with
Bobby Kumar
źródło
źródło
String.prototype.endsWith
.Odpowiedzi:
AKTUALIZACJA (24 listopada 2015):
Ta odpowiedź została pierwotnie opublikowana w roku 2010 (SZEŚĆ lat wstecz.), Więc zwróć uwagę na te wnikliwe komentarze:
Shauna - aktualizacja dla pracowników Google - wygląda na to, że ECMA6 dodaje tę funkcję. Artykuł MDN pokazuje również wypełnienie. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
TJ Crowder - Tworzenie podciągów nie jest drogie w nowoczesnych przeglądarkach; być może w 2010 roku opublikowano tę odpowiedź. Obecnie proste
this.substr(-suffix.length) === suffix
podejście jest najszybsze w Chrome, tak samo w IE11 jak indexOf, i tylko 4% wolniej (terytorium fergetaboutit) w Firefoksie: jsperf.com/endswith-stackoverflow/14 I szybsze we wszystkich przypadkach, gdy wynik jest fałszywy: jsperf.com/endswith-stackoverflow-when-false Oczywiście, z ES6 dodającymi końcówki, chodzi o dyskusję. :-)ORYGINALNA ODPOWIEDŹ:
Wiem, że to jest pytanie sprzed lat ... ale ja też tego potrzebuję i potrzebuję go do pracy w różnych przeglądarkach, więc ... łącząc odpowiedzi i komentarze wszystkich i nieco upraszczając:
indexOf
funkcji natywnej w celu uzyskania najszybszych wynikówindexOf
aby przejść do przoduPonadto, jeśli nie lubisz upychać rzeczy w prototypach natywnej struktury danych, oto samodzielna wersja:
EDYCJA: Jak zauważył @hamish w komentarzach, jeśli chcesz popełnić błąd po bezpiecznej stronie i sprawdzić, czy implementacja została już zapewniona, możesz po prostu dodać
typeof
kontrolę w ten sposób:źródło
this.substr(-suffix.length) === suffix
podejście jest najszybsze w Chrome, takie samo jak w IE11indexOf
i tylko o 4% wolniejsze (terytorium fergetaboutit) w Firefox: jsperf.com/endswith-stackoverflow/14 I szybsze we wszystkich przypadkach, gdy wynik jest fałszywy: jsperf .com / end-with-stackoverflow-when-false Oczywiście, z dodawaniem ES6endsWith
, chodzi o dyskusję. :-)będzie działać na wszystkich przeglądarkach, nie wymaga łatania małp
String
i nie wymaga skanowania całego łańcucha, jaklastIndexOf
ma to miejsce w przypadku braku dopasowania.Jeśli chcesz dopasować stały ciąg znaków, który może zawierać znaki specjalne wyrażeń regularnych, takie jak
'$'
, możesz użyć następujących opcji:i wtedy możesz użyć tego w ten sposób
źródło
lastIndexOf
skanuje cały ciąg tylko wtedy, gdy nie znajdzie dopasowania lub znajdzie dopasowanie na początku. Jeśli na końcu jest dopasowanie, to działa ono proporcjonalnie do długości sufiksu. Tak,/asdf$/.test(str)
daje true, gdystr
kończy się na"asdf"
.if( "mystring#".substr(-1) === "#" ) {}
źródło
slice()
? Działa to w moim szybkim teście IE7.Chodź, to jest poprawna
endsWith
implementacja:użycie
lastIndexOf
tylko tworzy niepotrzebne pętle procesora, jeśli nie ma dopasowania.źródło
===
jednak użyć .Ta wersja unika tworzenia podłańcucha i nie używa wyrażeń regularnych (niektóre odpowiedzi wyrażeń regularnych będą działać, inne są uszkodzone):
Jeśli wydajność jest dla Ciebie ważna, warto sprawdzić, czy
lastIndexOf
rzeczywiście jest szybsza niż tworzenie podłańcucha, czy nie. (Może to zależeć od używanego silnika JS ...) Może być szybsze w dopasowanym przypadku, a gdy łańcuch jest mały - ale gdy łańcuch jest duży, musi spojrzeć wstecz przez całą rzecz, nawet chociaż tak naprawdę nas to nie obchodzi :(charAt
Najlepszym sposobem na sprawdzenie pojedynczego znaku jest znalezienie jego długości, a następnie użycie .źródło
str+"$"
jako wyrażenia regularnego, są niepoprawne, ponieważ mogą nie być poprawnymi wyrażeniami regularnymi.Nie widziałem
slice
metody apporach . Więc zostawiam to tutaj:źródło
nie działa w przypadku, gdy oryginalna długość ciągu jest o jeden mniejsza niż długość ciągu wyszukiwania i nie znaleziono ciągu wyszukiwania:
lastIndexOf zwraca -1, następnie dodajesz długość szukanego ciągu i pozostaje ci długość oryginalnego ciągu.
Możliwą poprawką jest
źródło
From developer.mozilla.org String.prototype.endsWith ()
Podsumowanie
endsWith()
Metoda określa, czy końce ciąg z bohaterów inny ciąg, powracającego prawda czy fałsz jako właściwe.Składnia
Parametry
searchString : Znaki, które mają być wyszukiwane na końcu tego ciągu.
pozycja : Szukaj w tym ciągu tak, jakby ten ciąg był tylko tak długi; domyślnie jest to rzeczywista długość łańcucha, zaciśnięta w zakresie ustalonym przez długość łańcucha.
Opis
Ta metoda pozwala określić, czy łańcuch kończy się na innym łańcuchu.
Przykłady
Dane techniczne
ECMAScript Language Specification 6. wydanie (ECMA-262)
Kompatybilność z przeglądarkami
źródło
- Lub -
źródło
mam nadzieję, że to pomoże
tradycyjny sposób
źródło
Nie wiem o tobie, ale:
Dlaczego wyrażenia regularne? Po co mieszać z prototypem? substr? No chodź...
źródło
Kolejna szybka alternatywa, która działała dla mnie jak urok, używając wyrażenia regularnego:
źródło
Jeśli używasz lodash :
Jeśli nie używasz lodash, możesz pożyczyć od źródła .
źródło
Właśnie dowiedziałem się o tej bibliotece ciągów:
http://stringjs.com/
Dołącz plik js, a następnie użyj
S
zmiennej w następujący sposób:Można go również użyć w NodeJS, instalując go:
Wymagając go jako
S
zmiennej:Strona internetowa zawiera również linki do alternatywnych bibliotek ciągów, jeśli ta nie przypadnie Ci do gustu.
źródło
źródło
Tak wiele rzeczy na tak mały problem, po prostu użyj tego wyrażenia regularnego
źródło
Wiele lat minęło od tego pytania. Pozwól mi dodać ważną aktualizację dla użytkowników, którzy chcą skorzystać z najczęściej głosowanej odpowiedzi czakrytu.
Funkcje „EndWith” są już dodane do JavaScript jako część ECMAScript 6 (technologia eksperymentalna)
Zobacz to tutaj: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
Dlatego zaleca się dodanie sprawdzania istnienia natywnej implementacji, jak wspomniano w odpowiedzi.
źródło
źródło
Sposobem na przyszły dowód i / lub zapobieganie zastąpieniu istniejącego prototypu byłoby sprawdzenie testowe, aby sprawdzić, czy został on już dodany do prototypu String. Oto moje zdanie na temat wysoko ocenianej wersji nieregexowej.
źródło
if (!String.prototype.hasOwnProperty("endsWith"))
jest najlepszym sposobem. Dziękitypeof
„MooTools i niektóre inne biblioteki AJAX mogą cię zepsuć”, zgodnie z „Crockford on JavaScript - Level 7: ECMAScript 5: The New Parts”, o 15:50 min.Akceptowana odpowiedź @ chakrit to solidny sposób na samodzielne zrobienie tego. Jeśli jednak szukasz rozwiązania w pakiecie, polecam zajrzeć na underscore.string , jak wskazał @mlunoe. Przy użyciu underscore.string kod będzie wyglądał następująco:
źródło
jeśli nie chcesz używać lasIndexOf lub substr, to dlaczego nie spojrzeć na ciąg znaków w jego naturalnym stanie (tj. tablicę)
lub jako samodzielna funkcja
źródło
źródło
Po wszystkich tych długich zestawieniach odpowiedzi ten fragment kodu był prosty i łatwy do zrozumienia!
źródło
To jest implementacja EndWith:
String.prototype.endsWith = function (str) { return this.length >= str.length && this.substr(this.length - str.length) == str; }
źródło
Jest to implementacja
endsWith
:źródło
Opiera się to na zaakceptowanej odpowiedzi @ charkit, która pozwala na przekazanie tablicy argumentów lub ciągu znaków jako argumentu.
Wymaga to podkreślenia - ale prawdopodobnie można je dostosować, aby usunąć zależność podkreślenia.
źródło
_.str.endsWith
Korzyści:
źródło
Nie używaj wyrażeń regularnych. Są powolne, nawet w szybkich językach. Po prostu napisz funkcję, która sprawdza koniec łańcucha. Ta biblioteka ma ładne przykłady: groundjs / util.js . Uważaj, dodając funkcję do String.prototype. Ten kod zawiera ładne przykłady, jak to zrobić: groundjs / prototype.js Ogólnie rzecz biorąc, jest to przyjemna biblioteka na poziomie językowym: groundjs Możesz także rzucić okiem na lodash
źródło
wszystkie z nich są bardzo przydatnymi przykładami. Dodanie
String.prototype.endsWith = function(str)
pomoże nam po prostu wywołać metodę, aby sprawdzić, czy nasz łańcuch się z tym kończy, czy też nie, dobrze, też będzie to wyrażenie regularne.Znalazłem lepsze rozwiązanie niż moje. Dziękuję wszystkim.
źródło
Do coffeescript
źródło