JavaScript: сколько раз в строке встречается символ?

Ответы:

76

Вы можете удалить любой другой символ в строке и проверить длину:

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

Здесь подсчитывается, сколько aв str.

Гамбо
источник
1
Просто хочу отметить, что вы также можете учесть заглавные буквы, выполнив let xLength = str.replace(/[^a || A]/g, "").length;
HappyHands31
@ HappyHands31 Вы имеете в видуlet xLength = str.replace(/[^aA]/g, "").length;
Дональд Дак
43

Это учитывается a в примере ниже:

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

Если вам нужна нечувствительность к регистру, вам нужно что-то вроде

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

Так что он захватывает "A" и "a" ... Флаг "g" на самом деле не нужен, но вам нужен флаг "i"

Сарфраз
источник
1
@Josh Это зависит от того, что всем нравится. Например, мне нравится этот ответ, потому что его легко читать. Но кто-то другой предпочтет другой ответ, потому что он более технический или сложный, другой предпочтет другой ответ, потому что он потребляет меньше процессора и так далее ... вот почему JavaScript так хорош, это вкус свободы.
vdegenne
18

Используйте RegEx для подсчета количества букв "a" в строке.

var string = 'aajlkjjskdjfAlsj;gkejflksajfjskda';

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

Позвольте мне объяснить, как это работает:

string.matchЭто метод RegEx. Он ищет указанное регулярное выражение внутри указанной строки (в данном случае - строки "строка").

(/a/gi)Это настоящий RegEx. Он гласит: «Найди персонажа а». Все очень просто. На нем также есть два флага: «g» и «i». "G" говорит, что нужно найти ВСЕ вхождения символа "a". В противном случае он найдет только первую и никогда не будет считать после номера один. Второй флаг - «i». Это заставляет RegEx соответствовать всем регистрам этого символа. Если бы этого флага (i) не было, код выше засчитал бы только 4, потому что он пропустил бы прописную букву «A» в строке. Из-за «i» он будет соответствовать верхнему и нижнему регистру. Удалите «i», если хотите, чтобы регистр букв соответствовал регистру.

string.matchвозвращает массив всех совпадений, поэтому мы используем lengthметод для получения количества записей массива. Просто как тот!

Drazzah
источник
Я думаю, вам следует удалить i из gi, это источник ошибок. Вы можете добавить его в качестве бонуса, но в моем случае я специально искал совпадение с учетом регистра.
Gismo Ranas,
1
проблема здесь в том, что если у вас нет " a" in string, то string.match(/a/gi)равно, nullи вы получили ошибку Cannot read property 'length' of null.
pbialy
1
Часть 'gi' была очень полезна, сэр @Drazzah
Джейсон Себринг,
11

На мой взгляд, в этом случае удобнее и безопаснее избегать регулярных выражений.

Это потому, что если мы хотим иметь возможность подсчитывать любые символы, нам нужно рассмотреть два выражения. Один для общих символов и второй для специальных символов, например , как [, ], ^и так далее. Об этом легко забыть, но даже если мы вспомним об этом, я думаю, что мы излишне расширяем наш код.

В этом случае для строки strи символа chработает каждое из этих решений:

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

(спасибо @Sarfraz )

или

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

или

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

Наслаждайтесь!

simhumileco
источник
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
Хотя ваш фрагмент кода может решить проблему, вы должны описать, какова цель вашего кода (как он решает проблему). Кроме того, вы можете проверить stackoverflow.com/help/how-to-answer
Ахмад Ф,
@AhmadF, вы можете использовать это для> Сколько раз символ встречается в строке. и когда вы запустите этот сценарий, вы получите объект со свойствами (символами), который встречается более одного раза.
Нитин.