JavaScript: скільки разів символ трапляється в рядку?


Відповіді:


76

Ви можете видалити будь-який інший символ із рядка та перевірити довжину:

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

Тут підраховується, скільки as str.


1
Тільки хочу зазначити, що ви можете врахувати і великі let xLength = str.replace(/[^a || A]/g, "").length;
регістри,

@ 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);

Так що він захоплює прапор "А" та "а" ... "g" насправді не потрібен, але вам потрібен прапор "i"


1
@Josh Це залежить від того, що всім подобається. Наприклад, мені подобається ця відповідь, оскільки її легко читати. Але хтось віддасть перевагу іншій відповіді, оскільки вона є більш технічною або складною, інша людина віддасть перевагу іншій відповіді, оскільки вона їсть менше процесора і так далі .. ось чому JavaScript такий приємний, смак свободи.
vdegenne

18

Використовуйте RegEx для підрахунку кількості "a" в рядку.

var string = 'aajlkjjskdjfAlsj;gkejflksajfjskda';

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

Дозвольте пояснити, як це працює:

string.matchЦе метод RegEx. Він шукає вказаний RegEx всередині зазначеного рядка (у цьому випадку рядок "рядок").

(/a/gi)Це фактичний RegEx. Він читає: "знайдіть персонажа а". Це дуже просто. Він також містить два прапори, "g" та "i". "G" говорить про пошук ВСІХ випадків символу "a". В іншому випадку він знайшов би лише перший і ніколи не пролічив би номер один. Другий прапор - "i". Це змушує RegEx відповідати всім випадкам цього символу. Якби цього прапорця (i) не було, код вище містив би лише 4, оскільки він пропускав би велику букву "A" у рядку. Через "i" воно буде відповідати великій та нижній регістру. Видаліть "i", якщо ви хочете збігати регістр літер.

string.matchповертає масив усіх збігів, тому ми використовуємо lengthметод для отримання кількості записів масиву. Просто як це!


Я думаю, вам слід видалити i з gi, це джерело помилок. Ви можете додати його як бонус, але в моєму випадку я шукав спеціально збіг з урахуванням регістру.
Gismo Ranas

1
проблема тут в тому, що якщо у вас немає " a" 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)

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



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
Ahmad F

@AhmadF ви можете використовувати це для> Скільки разів символ зустрічається в рядку. і під час запуску цього сценарію ви отримаєте об’єкт із властивостями (символами), який трапляється більше одного разу.
Нітін.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.