Zaktualizowałem tę odpowiedź. Podoba mi się pomysł lepszego dopasowania, ale jest wolniejszy:
console.log(("str1,str2,str3,str4".match(/,/g) || []).length); //logs 3
console.log(("str1,str2,str3,str4".match(new RegExp("str", "g")) || []).length); //logs 4
jsfiddle
Użyj literału wyrażenia regularnego, jeśli wiesz, czego szukasz, jeśli nie, możesz użyć RegExp
konstruktora i przekazać g
flagę jako argument.
match
zwraca null
bez żadnych wyników, więc|| []
Oryginalna odpowiedź, którą udzieliłem w 2009 roku, jest poniżej. Tworzy tablicę niepotrzebnie, ale użycie podziału jest szybsze (od września 2014 r.). Jestem ambiwalentny, gdybym naprawdę potrzebował prędkości, nie byłoby wątpliwości, że użyłbym podziału, ale wolałbym użyć dopasowania.
Stara odpowiedź (z 2009 r.):
Jeśli szukasz przecinków:
(mainStr.split(",").length - 1) //3
Jeśli szukasz str
(mainStr.split("str").length - 1) //4
Zarówno w odpowiedzi @ Lo, jak i w moim głupim podziale testu jsperf pojawia się szybko, przynajmniej w Chrome, ale znowu tworzenie dodatkowej tablicy po prostu nie wydaje się rozsądne.
Istnieją co najmniej cztery sposoby. Najlepsza opcja, która powinna być również najszybsza - dzięki natywnemu silnikowi RegEx - - znajduje się na górze. Witryna jsperf.com jest obecnie niedostępna, w przeciwnym razie przedstawiłbym statystyki wydajności.
Aktualizacja : znajdź tutaj testy wydajnościi sam je uruchom, aby przyczynić się do uzyskania wyników. Szczegóły wyników zostaną podane później.
1.
2)
podział nie jest zalecany. Głodny zasobów. Przypisuje nowe wystąpienia „Array” dla każdego dopasowania. Nie próbuj tego w przypadku pliku> 100 MB przez FileReader. Możesz naprawdę łatwo obserwować zużycie zasobów DOKŁADNIE, korzystając z opcji profilera Chrome .
3)
4
szukanie jednego znaku
Aktualizacja:
5
mapowanie i filtrowanie elementów, niezalecane ze względu na ogólną wstępną alokację zasobów zamiast używania Pythonowskich „generatorów”
Podziel się: Zrobiłem to sens , ze obecnie 8 sposobów liczenia znaków, więc możemy bezpośrednio połączyć i podzielić się naszymi pomysłami - tylko dla zabawy, a może kilka interesujących punktów odniesienia :)
https://gist.github.com/2757250
źródło
||[]
dzieje, ale ta odpowiedź jest świetna! Każdy, kto podrapie się po głowach,match()
zwraca,null
jeśli nie zostaną znalezione żadne dopasowania, i||[]
zwraca tablicę o długości 0, jeślimatch()
zwracanull
, co oznacza,length()
że zwróci 0 zamiast produkować błąd typu.index = -2
, ale wielkie dzięki @AugustusDodaj tę funkcję do prototypu żądła:
stosowanie:
źródło
"stringsstringstrings".count("str")
?Szybka wyszukiwarka Google ma to (z http://www.codecodex.com/wiki/index.php?title=Count_the_number_of_occurrences_of_a_specific_character_in_a_string#JavaScript )
Użyj tego w ten sposób:
źródło
*
char (SyntaxError: nothing to repeat
)Wystarczy użyć podziału, aby sprawdzić liczbę wystąpień znaku w ciągu.
mainStr.split(',').length
// daje 4, która jest liczbą ciągów znaków po rozdzieleniu za pomocą przecinkamainStr.split(',').length - 1
// // daje 3, która jest liczbą przecinkówźródło
Oto podobne rozwiązanie, ale wykorzystuje
Array.prototype.reduce
Jak wspomniano,
String.prototype.split
działa znacznie szybciej niżString.prototype.replace
.źródło
Odkryłem, że najlepszym podejściem do wyszukiwania znaku w bardzo dużym ciągu (na przykład o długości 1 000 000 znaków) jest użycie tej
replace()
metody.Możesz zobaczyć jeszcze jeden pakiet JSPerf do testowania tej metody wraz z innymi metodami znajdowania znaku w ciągu.
źródło
Możesz także spocząć na swoim ciągu i pracować z nim jak z wykorzystaniem szeregu elementów
Lub
źródło
Wprowadziłem niewielką poprawę w stosunku do przyjętej odpowiedzi, pozwala ona sprawdzać z rozróżnianiem wielkości liter / bez rozróżniania wielkości liter i jest metodą dołączoną do obiektu łańcucha:
lit
jest ciągiem do wyszukania (takim jak „ex”), a cis nie rozróżnia wielkości liter, domyślnie false, umożliwi wybór dopasowania bez rozróżniania wielkości liter.Aby wyszukać ciąg pod
'I love StackOverflow.com'
kątem małej litery'o'
, użyj:amount_of_os
byłoby równe2
.Gdybyśmy ponownie przeszukali ten sam ciąg znaków, używając dopasowywania bez rozróżniania wielkości liter, użyłbyś:
Tym razem
amount_of_os
byłby równy3
, ponieważ kapitałO
z ciągu zostaje włączony do wyszukiwania.źródło
ok, inny z regexp - prawdopodobnie nie szybki, ale krótki i lepiej czytelny niż inne, w moim przypadku po prostu
'_'
liczyćpo prostu usuń wszystko, co nie wygląda jak twój char, ale nie wygląda ładnie z ciągiem jako wejściem
źródło
Wydajność Split vs RegExp
źródło
Najłatwiejszy sposób, żeby się dowiedzieć ...
Przykład-
źródło
Pracowałem nad małym projektem, który wymagał licznika podciągów. Poszukiwanie niewłaściwych fraz nie dało mi rezultatów, jednak po napisaniu własnej implementacji natknąłem się na to pytanie. W każdym razie, oto moja droga, prawdopodobnie jest wolniejsza niż większość tutaj, ale może być komuś pomocna:
http://jsfiddle.net/5ZzHt/1/
Daj mi znać, jeśli ta implementacja zakończy się niepowodzeniem lub nie spełnia niektórych standardów! :)
AKTUALIZACJA Możesz zastąpić:
Z:
Ciekawe lektury omawiające powyższe: http://www.erichynds.com/blog/javascript-length-property-is-a-stored-value
źródło
Jeśli używasz lodash, metoda _.countBy zrobi to:
Ta metoda działa również z tablicą:
źródło
Oto moje rozwiązanie. Wiele rozwiązań już zostało opublikowanych przede mną. Ale uwielbiam dzielić się tutaj moim poglądem.
Tutaj znajdziesz moją REPL
źródło
Najszybszą metodą wydaje się być operator indeksu:
Lub jako funkcja prototypowa:
źródło
Poniżej zastosowano wyrażenie regularne do przetestowania długości. Testex zapewnia, że nie masz 16 lub więcej kolejnych znaków bez przecinków. Jeśli przejdzie test, przechodzi do podziału łańcucha. liczenie przecinków jest tak proste, jak liczenie tokenów minus jeden.
źródło
źródło
Co z string.split (pożądanyCharecter) .length-1
Przykład:
var str = "hellow how is life"; var len = str. podświetlony („h”). długość-1; da licznik 2 dla znaku „h” w powyższym ciągu;
źródło
Używam Node.js v.6.0.0, a najszybszy jest ten z indeksem (trzecia metoda w odpowiedzi Lo Sauera).
Drugi to:
źródło
Oto jeden prawie tak szybki, jak metody dzielenia i zastępowania, które są nieco szybsze niż metoda regex (w chrome).
źródło
Właśnie zrobiłem bardzo szybki i brudny test na repl.it przy użyciu Node v7.4 . W przypadku pojedynczego znaku standard pętli jest najszybszy:
Jakiś kod :
Wyniki z kilku przebiegów :
źródło
I jest:
Działa również z liczbami całkowitymi!
źródło
Moje rozwiązanie:
źródło
String.prototype.match
zwrotynull
bez dopasowań. Oznacza to brak odniesienia do obiektu zlength
atrybutem. Innymi słowy:String.prototype.match.call('willnotwork', /yesitwill/) === null
Piąta metoda w odpowiedzi Leo Sauersa kończy się niepowodzeniem, jeśli znak znajduje się na początku ciągu. na przykład
da 2 zamiast 3, ponieważ funkcja filtru Boolean daje wartość false dla 0.
Inne możliwe funkcje filtra:
źródło
Wiem, że to może być stare pytanie, ale mam proste rozwiązanie dla początkujących na niskim poziomie w JavaScript.
Jako początkujący mogłem zrozumieć tylko niektóre rozwiązania tego pytania, więc użyłem dwóch zagnieżdżonych pętli FOR, aby sprawdzić każdy znak względem każdego innego znaku w ciągu, zwiększając zmienną count dla każdego znalezionego znaku, który jest równy temu znakowi.
Utworzyłem nowy pusty obiekt, w którym każdy klucz właściwości jest znakiem, a wartością jest to, ile razy każdy znak pojawił się w ciągu (liczba).
Przykładowa funkcja: -
źródło
Uważam, że poniższe rozwiązanie będzie bardzo krótkie, bardzo szybkie, zdolne do pracy z bardzo długimi ciągami, zdolne do obsługi wyszukiwania wielu znaków, odporne na błędy i zdolne do obsługi wyszukiwania pustych ciągów.
Przykładowe użycie:
Powyższy kod naprawia główny błąd wydajności w Jakubie Wawszczyku, że kod szuka dopasowania nawet po tym, jak indexOf mówi, że nie ma, a jego wersja nie działa, ponieważ zapomniał podać parametry wejściowe funkcji.
źródło
W javascript możesz użyć powyższego kodu, aby uzyskać wystąpienie znaku w ciągu.
źródło
Moje rozwiązanie z ramda js:
Link do REPL.
źródło
Funkcja przyjmuje ciąg znaków jako parametr i liczy wystąpienie każdego unikalnego znaku w ciągu. Wynik występuje w parze klucz-wartość dla każdego znaku.
źródło