JavaScript: ile razy znak występuje w ciągu?


Odpowiedzi:


76

Możesz usunąć dowolny inny znak w ciągu i sprawdzić jego długość:

str.replace(/[^a]/g, "").length

Tutaj liczy się, ile ajest w str.


1
Chcę tylko zaznaczyć, że możesz również uwzględnić wielkie litery, robiąc let xLength = str.replace(/[^a || A]/g, "").length;
HappyHands

@ HappyHands31 Masz na myślilet xLength = str.replace(/[^aA]/g, "").length;
Kaczor Donald

43

Liczy się to a w poniższym przykładzie:

str = "A man is as good as his word";
alert(str.split('a').length-1);

Jeśli chcesz, aby wielkość liter nie była rozróżniana, potrzebujesz czegoś takiego jak

alert(str.split( new RegExp( "a", "gi" ) ).length-1);

Aby przechwytywał flagę „A” i „a” ... „g”, nie jest naprawdę potrzebna, ale potrzebujesz flagi „i”


1
@Josh To zależy od tego, co wszyscy lubią. Na przykład podoba mi się ta odpowiedź, ponieważ jest łatwa do odczytania. Ale ktoś inny będzie wolał inną odpowiedź, ponieważ jest bardziej techniczna lub trudniejsza, inna osoba będzie wolała inną odpowiedź, ponieważ zużywa mniej procesora i tak dalej ... dlatego JavaScript jest taki fajny, posmak wolności.
vdegenne

18

Użyj wyrażenia regularnego, aby policzyć liczbę „a” w ciągu.

var string = 'aajlkjjskdjfAlsj;gkejflksajfjskda';

document.write(string.match(/a/gi).length);

Pozwól mi wyjaśnić, jak to działa:

string.matchTo jest metoda RegEx. Wyszukuje określone wyrażenie regularne wewnątrz określonego ciągu (w tym przypadku jest to ciąg „ciąg”).

(/a/gi)To jest rzeczywiste wyrażenie regularne. Brzmi: „znajdź znak a”. To jest bardzo proste. Zawiera również dwie flagi, „g” i „i”. „G” mówi, że należy znaleźć WSZYSTKIE wystąpienia znaku „a”. W przeciwnym razie znalazłby tylko pierwszy i nigdy nie odliczałby więcej niż numer jeden. Druga flaga to „i”. Sprawia, że ​​wyrażenie RegEx pasuje do wszystkich przypadków tego znaku. Gdyby tej flagi (i) nie było, powyższy kod liczyłby tylko 4, ponieważ pomijałby wielką literę „A” w ciągu. Ze względu na „i” dopasuje duże i małe litery. Usuń „i”, jeśli chcesz dopasować wielkość liter.

string.matchzwraca tablicę wszystkich dopasowań, więc używamy lengthmetody, aby pobrać liczbę wpisów tablicy. Proste!


Myślę, że powinieneś usunąć i z gi, jest to źródło błędów. Możesz dodać to jako bonus, ale w moim przypadku szukałem szczególnie dopasowania z uwzględnieniem wielkości liter.
Gismo Ranas,

1
problem polega na tym, że jeśli nie masz „ a” w string, to string.match(/a/gi)jest równe nulli masz błąd Cannot read property 'length' of null.
pbialy

1
Część „gi” była bardzo pomocna, Sir @Drazzah
Jason Sebring

11

Moim zdaniem w tym przypadku wygodniej i bezpieczniej jest unikać wyrażeń regularnych

To dlatego, że jeśli chcemy móc liczyć dowolne znaki, musimy wziąć pod uwagę dwa wyrażenia. Jeden dla wspólnych znaków, a drugi dla specjalnych znaków, na przykład takich jak [, ], ^i tak dalej. Łatwo o tym zapomnieć, ale nawet jeśli o tym pamiętamy, myślę, że niepotrzebnie rozszerzamy nasz kod.

W tym przypadku dla string stri character chdziała każde z tych rozwiązań:

let count = str.split(ch).length - 1

(dzięki @Sarfraz )

lub

let count = str.split('').filter(x => x == ch).length

lub

let count = 0
str.split('').forEach(x => x == ch ? count++ : null)

Cieszyć się!


4
var s = "dqsskjhfds";
alert(s.length - s.replace(/a/g, "").length); // number of 'a' in the string

1
var a = "acvbasbb";
var b= {};
for (let i=0;i<a.length;i++){
    if((a.match(new RegExp(a[i], "g"))).length > 1){
        b[a[i]]=(a.match(new RegExp(a[i], "g"))).length;
    }
}
console.log(b);

1
Chociaż Twój fragment kodu może rozwiązać problem, powinieneś opisać, jaki jest cel Twojego kodu (jak rozwiązuje problem). Ponadto możesz sprawdzić stackoverflow.com/help/how-to-answer
Ahmad F

@AhmadF możesz tego użyć do> Ile razy znak występuje w ciągu. a po uruchomieniu tego skryptu otrzymasz obiekt z właściwościami (znakami), które występują więcej niż raz.
Nitin.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.