Jak mogę policzyć, ile razy dany ciąg występuje w innym ciągu. Na przykład to właśnie próbuję zrobić w Javascript:
var temp = "This is a string.";
alert(temp.count("is")); //should output '2'
javascript
regex
string
TruMan1
źródło
źródło
Odpowiedzi:
W
g
wyrażeniu regularnym (skrót od globalnego ) mówi się, aby przeszukać cały ciąg, a nie tylko znaleźć pierwsze wystąpienie. To pasujeis
dwa razy:A jeśli nie ma dopasowań, zwraca
0
:źródło
count = (str.match(/is/g) || []).length
załatwić sprawę, jeśli nie masz dopasowania.RegExp
konstruktora i przekazując szukany ciąg, ale w takim przypadku musisz uciec od wszystkich metaznaków. W tym scenariuszu preferowane jest podejście oparte na czystym ciągu.Stosowanie
allowOverlapping
Mecze:
Test jednostkowy
Reper
Sensźródło
substring.length
prawie każdą pętlę, powinieneś rozważyć umieszczenie jej w pamięci podręcznej pozawhile
occurrences(11,1) //2
i nadal będzie działać. (Robi się to szybciej, zamiast sprawdzać typy i wywoływaćźródło
countInstances("isisisisisis", "is") === 0
.Możesz spróbować:
źródło
theString.split(myvar).length - 1
których nie możesz z prostym wyrażeniem regularnymMoje rozwiązanie:
źródło
countOcurrences('Hello...','.')==8
Możesz użyć
match
do zdefiniowania takiej funkcji:źródło
return m ? m.length:-1;
.Wersja inna niż wyrażenia regularne:
źródło
is
wystąpieńWystarczy code-golfa Rebecca Chernoffa jest rozwiązanie :-)
źródło
Zwróci 2.
źródło
Oto najszybsza funkcja!
Dlaczego to jest szybsze?
Wszystkie operacje są tak połączone, jak to tylko możliwe, unikając spowolnienia z powodu wielu operacji
Oto wolniejsza i bardziej czytelna wersja:
Ten jest wolniejszy z powodu licznika, długich nazw var i niewłaściwego użycia 1 var.
Aby go użyć, po prostu wykonaj następujące czynności:
Edycja: (2013/12/16)
NIE używaj z Operą 12.16 lub starszą! zajmie to prawie 2,5 razy więcej niż regex!
W przypadku Chrome to rozwiązanie zajmie od 14 do 20 ms dla 1 000 000 znaków.
Rozwiązanie wyrażenia regularnego zajmuje 11-14 ms dla tej samej kwoty.
Korzystanie z funkcji (na zewnątrz
String.prototype
) zajmie około 10–13 ms.Oto użyty kod:
Wynik wszystkich rozwiązań powinien wynosić 100 000!
Uwaga: jeśli chcesz to funkcja liczyć więcej niż 1 char, gdzie zmiany
c=(c+'')[0]
wc=c+''
źródło
źródło
Myślę, że cel wyrażenia regularnego jest bardzo różny od
indexOf
.indexOf
po prostu znajdź wystąpienie określonego ciągu, podczas gdy w wyrażeniu regularnym możesz używać symboli wieloznacznych,[A-Z]
co oznacza, że znajdzie on dowolny wielki znak w słowie bez podawania rzeczywistego znaku.Przykład:
źródło
Super duper old, ale musiałem zrobić coś takiego dzisiaj i pomyślałem tylko o sprawdzeniu SO później. Działa dla mnie dość szybko.
źródło
Patrz: - policz podciąg pojawi się w ciągu, aby uzyskać wyjaśnienie krok po kroku.
źródło
Opierając się na odpowiedzi @ Vittim.us powyżej. Podoba mi się kontrola, jaką zapewnia mi jego metoda, dzięki czemu łatwo ją rozszerzać, ale musiałem dodać niewrażliwość na wielkość liter i ograniczać dopasowania do całych słów z obsługą interpunkcji. (np. „kąpiel” oznacza „kąpiel”. ale nie „kąpiel”)
Wyrażenie interpunkcyjne pochodzi z: https://stackoverflow.com/a/25575009/497745 ( Jak mogę usunąć całą interpunkcję z ciągu znaków w JavaScript za pomocą regex? )
Jeśli zauważysz błędy lub ulepszenia, możesz modyfikować i refaktoryzować tę odpowiedź.
źródło
Dla każdego, kto znajdzie ten wątek w przyszłości, zauważ, że zaakceptowana odpowiedź nie zawsze zwróci poprawną wartość, jeśli ją uogólnisz, ponieważ dusi operatorów wyrażeń regularnych, takich jak
$
i.
. Oto lepsza wersja, która poradzi sobie z każdą igłą:źródło
Użyj get_occurrence (varS, string), aby znaleźć występowanie zarówno znaków, jak i łańcucha w ciągu.
źródło
Spróbuj
źródło
Prosta wersja bez wyrażenia regularnego:
źródło
Nikt tego nigdy nie zobaczy, ale dobrze jest raz na jakiś czas przywracać funkcje rekurencyjne i strzałkowe (celowo wspaniale)
źródło
Spróbuj tego
Fiddle Link: https://jsfiddle.net/rajaramtt/gn0dtsjc/1/
źródło
Teraz jest to bardzo stary wątek, z którym się zetknąłem, ale ponieważ wielu opublikowało swoje odpowiedzi, oto mój, mając nadzieję, że pomogę komuś z tym prostym kodem.
Nie jestem pewien, czy jest to najszybsze rozwiązanie, ale wolałem to ze względu na prostotę i nie używanie wyrażenia regularnego (po prostu nie lubię ich używać!)
źródło
Ta funkcja zwraca liczbę wystąpień słowa w tekście.
Zauważ, że używamy toLowerCase do obliczania liczby wystąpień niezależnie od formatu (wielka, wielka ...) słowa i tekstu
źródło
Odpowiedź dla Leandro Batisty: tylko problem z wyrażeniem regularnym.
źródło
źródło
Trochę późno, ale zakładając, że mamy następujący ciąg:
Najpierw podzielimy się na wszystko, co chcesz dopasować, to zwróci tablicę ciągów.
Następnie otrzymujemy jego długość i odejmujemy od niej 1, ponieważ domyślnie split ma tablicę o rozmiarze 1 i konsekwentnie zwiększa jej rozmiar za każdym razem, gdy znajdzie zdarzenie.
Możesz to zrobić w jednym wierszu w następujący sposób:
Mam nadzieję, że to pomaga: D
źródło
To rozwiązanie opiera się na
.replace()
metodzie, która akceptuje RegEx jako pierwszy parametr i funkcję jako drugi parametr , którego możemy użyć jako zamknięcia do zwiększenia licznika ...Stosowanie
źródło
natknąłem się na ten post.
Ten sam algorytm można określić krócej:
źródło
substr_count
przetłumaczone na JavaScript z phpSprawdź funkcję translatora php w Locutus substr_count
źródło
Spróbuj tego:
źródło