JavaScript: Bao nhiêu lần một ký tự xuất hiện trong một chuỗi?


Câu trả lời:


76

Bạn có thể xóa bất kỳ ký tự nào khác trong chuỗi và kiểm tra độ dài:

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

Ở đây nó được đếm có bao nhiêu as trong str.


1
Chỉ muốn chỉ ra rằng bạn có thể giải thích cho chữ hoa cũng bằng cách làm let xLength = str.replace(/[^a || A]/g, "").length;
HappyHands31

@ HappyHands31 Ý bạn làlet xLength = str.replace(/[^aA]/g, "").length;
Vịt Donald

43

Điều này được tính a trong ví dụ dưới đây:

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

Nếu bạn muốn phân biệt chữ hoa chữ thường, bạn muốn một cái gì đó giống như

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

Để nó lấy cờ "A" và "a" ... "g" không thực sự cần thiết, nhưng bạn cần cờ "i"


1
@Josh Nó phụ thuộc vào những gì mọi người thích. Ví dụ, tôi thích câu trả lời này vì nó dễ đọc. Nhưng ai đó sẽ thích một câu trả lời khác vì nó kỹ thuật hơn hoặc thách thức hơn, một người khác sẽ thích một câu trả lời khác vì nó ăn ít cpu hơn, v.v. đó là lý do tại sao JavaScript rất hay, một hương vị của sự tự do.
vdegenne

18

Sử dụng RegEx để đếm số "a" trong một chuỗi.

var string = 'aajlkjjskdjfAlsj;gkejflksajfjskda';

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

Hãy để tôi giải thích cách hoạt động của điều này:

string.matchĐây là một phương thức RegEx. Nó tìm kiếm RegEx được chỉ định bên trong chuỗi được chỉ định (trong trường hợp này là chuỗi "string").

(/a/gi)Đây là RegEx thực tế. Nó đọc, "tìm ký tự a." Nó rất đơn giản. Nó cũng mang hai lá cờ, "g" và "i". Chữ "g" nói để tìm TẤT CẢ các lần xuất hiện của ký tự "a". Nếu không, nó sẽ chỉ tìm thấy số đầu tiên và nó sẽ không bao giờ vượt qua số một. Lá cờ thứ hai là "i". Nó làm cho RegEx khớp với tất cả các trường hợp của ký tự đó. Nếu cờ (i) đó không có ở đó, mã trên sẽ chỉ được tính 4, vì nó sẽ bỏ qua chữ hoa "A" trong chuỗi. Vì chữ "i", nó sẽ khớp với chữ hoa chữ thường. Bỏ chữ "i" nếu bạn muốn khớp chữ cái.

string.matchtrả về một mảng của tất cả các kết quả phù hợp, vì vậy chúng tôi sử dụng lengthphương thức để truy xuất số lượng mục nhập của mảng. Đơn giản như thế!


Tôi nghĩ bạn nên loại bỏ i khỏi gi, nó là một nguồn của lỗi. Bạn có thể thêm nó như một phần thưởng, nhưng trong trường hợp của tôi, tôi đang tìm kiếm cụ thể cho đối sánh phân biệt chữ hoa chữ thường.
Gismo Ranas

1
vấn đề ở đây là nếu bạn không có " a" trong string, thì string.match(/a/gi)bằng nullvà bạn gặp lỗi Cannot read property 'length' of null.
p pesty

1
Phần 'gi' rất hữu ích, thưa ngài @Drazzah
Jason Sebring

11

Theo tôi, việc tránh các cụm từ thông dụng trong trường hợp này sẽ thuận tiện và an toàn hơn

Đó là bởi vì nếu chúng ta muốn có thể đếm bất kỳ loại ký tự nào thì chúng ta cần phải xem xét hai biểu thức. Một cho chung nhân vật và thứ hai cho đặc biệt nhân vật ví dụ như [, ], ^và vân vân. Thật dễ dàng để quên nó, nhưng ngay cả khi chúng ta nhớ nó, tôi nghĩ rằng chúng ta đang mở rộng mã của mình một cách không cần thiết.

Trong trường hợp này, đối với chuỗi strvà ký tự chhoạt động, mỗi giải pháp sau:

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

(cảm ơn @Sarfraz )

hoặc là

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

hoặc là

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

Thưởng thức!


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
Mặc dù đoạn mã của bạn có thể giải quyết vấn đề, nhưng bạn nên mô tả mục đích của mã của mình là gì (cách nó giải quyết vấn đề). Hơn nữa, bạn có thể muốn kiểm tra stackoverflow.com/help/how-to-answer
Ahmad F

@AhmadF bạn có thể sử dụng cái này cho> Số lần một ký tự xuất hiện trong một chuỗi. và khi bạn chạy tập lệnh này, bạn sẽ nhận được một đối tượng có thuộc tính (ký tự) xuất hiện nhiều hơn một lần.
Nitin.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.