Как подсчитать, сколько раз первый символ появляется в строке javascript?

Вот код

var number = "213 112 213 213 12345 feef";
var res = number.charAt(0);
 
var num_matches = str.match(/res/gi).length;
 
alert(num_matches);

Ответы (2 шт):

Автор решения: CbIPoK2513

let string = '213 112 213 213 12345 feef';

function Func1(str, num) {
  let search = new RegExp('('+str[num]+')', 'gim');
  return str.match(search).length;
}

console.info(Func1(string, 0));
// Первый параметр - в какой строке будем искать,
// Второй параметр - индекс символа в строке, этот символ будем искать

→ Ссылка
Автор решения: vsemozhebuty

Дальнейшее может показться переусложнённым, но лучше сразу привыкать делать правильно, чтобы потом эти тонкости не подвели вас в неожиданный момент.

В вашей первоначальной попытке есть несколько недочётов.

  1. number.charAt(0); не будет правильно работать со всеми символами Юникода — если первым символом будет суррогатная пара (например, эмодзи), number.charAt(0); вернёт только её половину.
  2. str.match(/res/gi) — в литералах регулярных выражений не интерполируются переменные. Для этого нужно использовать конструктор new RegExp(). Но при этом нужно будет экранировать специальные символы, иначе они будут искать не то, что вам нужно (например, если первым символом в строке будет точка ., она станет обозначением любого символа, а не точки). Другой выход — попробовать использовать замену строк, а не регулярных выражений, как вам посоветовали в комментарии.

Вот один из вариантов c регулярным выражением:

const string = "213 112 213 213 12345 feef";

const first = String.fromCodePoint(string.codePointAt(0));
// Eщё вариант с поддержкой Юникода, он покороче,
// но займёт больше времени и ресурсов: [...string][0]

const re = new RegExp(first.replace(/[\\.^$(){}[\]|?*+]/gu, '\\$&'), 'giu');

const num_matches = string.match(re).length;

console.log(num_matches);

Вот вариант с заменой строки (чтобы правильно обрабатывался Юникод, мы опять-таки сравниваем не длины строк непосредственно, но массивы символов Юникода, на которые разбивает строку итерация; также мы должны совершить замены с обоими регистрами символа):

const string = "213 112 213 213 12345 feef";

const first = String.fromCodePoint(string.codePointAt(0));

const replaced = const replaced = string.replaceAll(first.toLowerCase(), '')
                                        .replaceAll(first.toUpperCase(), '');

const num_matches = [...string].length - [...replaced].length;

console.log(num_matches);

Возможен ещё вариант с массивом символов:

const string = "213 112 213 213 12345 feef";

const symbols = [...string];

const first = symbols[0];

const num_matches = symbols.filter(symbol => symbol === first).length;

console.log(num_matches);

→ Ссылка