JavaScript: Bir dizede bir karakter kaç kez geçiyor?


Yanıtlar:


82

Dizedeki diğer karakterleri kaldırabilir ve uzunluğunu kontrol edebilirsiniz:

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

İşte kaç sayılır aiçindedir s str.


1
Yaparak büyük harfleri de hesaba let xLength = str.replace(/[^a || A]/g, "").length;
katabileceğinizi belirtmek isterim

@ HappyHands31 Yani demek istiyorsunlet xLength = str.replace(/[^aA]/g, "").length;
Donald Duck

46

Bu a , aşağıdaki örnekte sayılır :

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

Büyük / küçük harf duyarlı olmasını istiyorsanız, şöyle bir şey istersiniz:

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

"A" ve "a" ... "g" bayrağını yakalaması için gerçekten gerekli değil, ancak "i" bayrağına ihtiyacınız var


1
@Josh Herkesin neyi sevdiğine bağlı. Mesela bu cevabı okuması kolay olduğu için seviyorum. Ama bir başkası daha teknik veya zorlayıcı olduğu için başka bir cevabı tercih edecek, başka bir kişi başka bir cevabı tercih edecek çünkü daha az cpu yiyor vb. İşte bu yüzden JavaScript çok güzel, özgürlüğün tadı.
vdegenne

21

Bir dizedeki "a" sayısını saymak için bir Normal İfade kullanın.

var string = 'aajlkjjskdjfAlsj;gkejflksajfjskda';

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

Bunun nasıl çalıştığını açıklamama izin verin:

string.matchBu bir RegEx yöntemidir. Belirtilen dizenin içinde belirtilen Normal İfadeyi arar (bu durumda, "dize" dizesi).

(/a/gi)Bu gerçek Normal İfadedir. "A karakterini bul" yazıyor. Çok basit. Ayrıca "g" ve "i" olmak üzere iki bayrak taşır. "G", "a" karakterinin TÜM oluşumlarını bulmayı söyler. Aksi takdirde sadece ilkini bulur ve bir numarayı asla geçmez. İkinci bayrak "i" dir. RegEx'in bu karakterin tüm durumlarını eşleştirmesini sağlar. Eğer bu bayrak (i) orada olmasaydı, yukarıdaki kod sadece 4'ü sayardı, çünkü dizedeki büyük "A" harfini atlardı. "İ" nedeniyle, büyük ve küçük harflerle eşleşecektir . Büyük / küçük harf eşleştirmek istiyorsanız "i" harfini kaldırın.

string.matchtüm eşleşmelerin bir dizisini döndürür, bu nedenle lengthdizi girdilerinin sayısını almak için yöntemi kullanırız. Bu kadar basit!


Sanırım i'yi gi'den çıkarmalısın, bu bir hata kaynağı. Bunu bir bonus olarak ekleyebilirsiniz, ancak benim durumumda özellikle büyük / küçük harfe duyarlı eşleşme arıyordum.
Gismo Ranas

2
Burada sorun, "yoksa olmasıdır aiçinde" string, sonra string.match(/a/gi)eşittir nullve hata var Cannot read property 'length' of null.
pbialy

1
'Gi' kısmı çok yardımcı oldu, Efendim @Drazzah
Jason Sebring

15

Bence bu durumda düzenli ifadelerden kaçınmak daha uygun ve güvenlidir.

Çünkü herhangi bir tür karakteri sayabilmek istiyorsak, iki ifadeyi dikkate almamız gerekir. One ortak karakterler ve ikinci özel gibi örneğin karakterler [, ], ^vb. Unutmak kolaydır, ancak hatırlasak bile, kodumuzu gereksiz yere genişlettiğimizi düşünüyorum.

In Bu durumda dizesi strve karakter chbu çözümlerin her biri çalışır:

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

( @ Sarfraz'a teşekkürler )

veya

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

veya

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

Zevk almak!


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
Kod pasajınız sorunu çözebilir, ancak kodunuzun amacını (sorunu nasıl çözdüğünü) açıklamalısınız. Ayrıca, stackoverflow.com/help/how-to-answer
Ahmad F

@AhmadF bunu> bir dizede bir karakterin kaç kez geçtiği için kullanabilirsiniz. ve bu betiği çalıştırdığınızda, özellikleri (karakterleri) olan ve birden çok kez oluşan bir nesne elde edersiniz.
Nitin.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.