Обновлено:

Подсчет элементов в строке

Строка из 1 000 символов, а сколько в ней букв «а»? Сколько слов? Сколько уникальных символов? Задача подсчёта элементов в строке возникает при обработке текста, анализе данных, валидации форм и алгоритмических задачах.

Анализатор строки

Введите строку для анализа
Можно вставить до 100 000 символов Оставьте пустым, если не нужно

Что можно посчитать в строке

Под «элементами» понимают разные сущности:

ЭлементПримерРезультат
Все символы (длина строки)"hello"5
Определённый символ"hello""l"2
Подстрока"ababab""ab"3
Слова"hello world"2
Уникальные символы"hello"4 (h, e, l, o)
Частота каждого символа"hello"h:1, e:1, l:2, o:1

Каждый тип подсчёта решает свою задачу: длина строки нужна для валидации, частота символов – для частотного анализа, подсчёт слов – для статистики текста.

Как посчитать длину строки

Длина строки – количество символов (кодовых точек) от первого до последнего.

Python:

text = "Привет, мир!"
length = len(text)  # 12

JavaScript:

let text = 'Привет, мир!';
let length = text.length; // 12

Java:

String text = "Привет, мир!";
int length = text.length(); // 12

C++:

#include <string>
std::string text = "Hello";
int length = text.length(); // 5

Для строк с кириллицей или эмодзи длина может отличаться от ожидаемой – об этом ниже в разделе про Unicode.

Как посчитать количество вхождений символа или подстроки

Python – метод count()

text = "абракадабра"
text.count("а")      # 5 – все буквы "а"
text.count("абра")   # 2 – подстрока "абра"
text.count("бр")     # 2 – подстрока "бр"

Метод count() ищет непересекающиеся вхождения слева направо:

"aaaa".count("aa")  # 2, не 3

Для поиска перекрывающихся вхождений нужен другой подход:

text = "aaaa"
sub = "aa"
count = sum(1 for i in range(len(text) - len(sub) + 1) if text[i:i+len(sub)] == sub)

JavaScript – несколько способов

let text = 'абракадабра';

// Способ 1: split()
text.split('а').length -
  1(
    // 5

    // Способ 2: match() с регулярным выражением
    text.match(/а/g) || []
  ).length; // 5

// Способ 3: цикл
let count = 0;
for (let char of text) {
  if (char === 'а') count++;
}

Для подстрок удобнее split():

'абракадабра'.split('абра').length - 1; // 2

Java – indexOf() в цикле

String text = "абракадабра";
String sub = "абра";
int count = 0;
int index = 0;
while ((index = text.indexOf(sub, index)) != -1) {
    count++;
    index += sub.length();
}
// count = 2

C# – метод Count() из LINQ

string text = "абракадабра";
int count = text.Count(c => c == 'а');  // 5

Сколько слов в строке

Подсчёт слов зависит от определения: что считать разделителем. Пробелы, табы, переносы строк, знаки препинания.

Python:

text = "Привет,  мир! Как дела?"
len(text.split())  # 4 – split() без аргументов делит по любым пробельным

split() без аргументов автоматически обрабатывает несколько пробелов подряд и краевые пробелы.

Если нужно исключить знаки препинания:

import re
text = "Привет, мир! Как дела?"
words = re.findall(r'\b\w+\b', text)
len(words)  # 4

JavaScript:

let text = 'Привет,  мир! Как дела?';
text.trim().split(/\s+/).length; // 4

trim() убирает пробелы по краям, /\s+/ – разделение по любому количеству пробельных символов.

Подсчёт уникальных элементов

Уникальные символы

text = "hello"
unique = len(set(text))  # 4 – h, e, l, o

Множество set убирает дубликаты, len() считает количество оставшихся.

Частота каждого символа

from collections import Counter

text = "hello"
freq = Counter(text)

freq['l']  # 2
freq.most_common(2)  # [('l', 2), ('h', 1)]

Ручной способ без импортов:

freq = {}
for char in text:
    freq[char] = freq.get(char, 0) + 1

JavaScript:

let text = 'hello';
let freq = {};
for (let char of text) {
  freq[char] = (freq[char] || 0) + 1;
}
// {h: 1, e: 1, l: 2, o: 1}

Какой метод подсчёта выбрать

ЗадачаPythonJavaScript
Длина строкиlen(s)s.length
Вхождения символаs.count("a")s.split("a").length - 1
Вхождения подстрокиs.count("ab")s.split("ab").length - 1
Перекрывающиеся вхожденияЦикл с rangeЦикл с indexOf
Количество словlen(s.split())s.trim().split(/\s+/).length
Уникальные символыlen(set(s))new Set(s).size
Частота символовCounter(s)Объект-аккумулятор

Проблемы Unicode и эмодзи

Стандартные функции подсчёта работают с кодовыми точками, а не с визуальными символами. Это создаёт три проблемы.

Суррогатные пары

Эмодзи и редкие символы кодируются двумя 16-битными значениями (суррогатная пара) в UTF-16. JavaScript использует UTF-16 внутри:

'👋'.length; // 2, хотя визуально один символ

Решение – оператор расширения:

[...'👋'].length; // 1

Комбинирующие символы

Буква «ё» может быть составлена из «е» + ударение (U+0301). Визуально один символ, а кодовых точек – две:

text = \u0301"  # "е" + комбинирующее ударение
len(text)  # 2 в Python

Python 3.8+ решает это через модуль grapheme (сторонний):

import grapheme
grapheme.length(\u0301")  # 1

Модификаторы тона кожи и ZWJ-последовательности

Составные эмодзи (семья, флаги, персонажи с тоном кожи) используют несколько кодовых точек, склеенных через Zero Width Joiner (U+200D):

"👨‍👩‍👧‍👦".length      // 11 в JavaScript
[..."👨‍👩‍👧‍👦"].length  // 7, а не 1

Для точного подсчёта графем в JavaScript нужна библиотека grapheme-splitter.

Подсчёт без учёта регистра

Часто нужно посчитать символы независимо от регистра – «А» и «а» как один и тот же символ.

text = "Ананас"
text.lower().count("а")  # 2

Код на JavaScript:

let text = 'Ананас';
text.toLowerCase().split('а').length - 1; // 2

Для частотного анализа без учёта регистра:

from collections import Counter
text = "Ананас"
freq = Counter(text.lower())

Быстрый подсчёт без кода

Когда нужен результат без написания программы – используйте калькулятор выше. Введите строку, и он покажет:

  • общее количество символов
  • количество слов
  • частоту каждого символа
  • число уникальных символов

Это удобно для проверки текстов, подсчёта лимитов (СМС, твиты, мета-теги) и быстрого анализа.

Статья носит справочный характер. Для критически важных вычислений проверяйте результаты несколькими способами.

Часто задаваемые вопросы

Как посчитать количество определённого символа в строке?

В Python используйте метод count(): “hello”.count(“l”) вернёт 2. В JavaScript – разделите строку по символу и отнимите 1: str.split(“l”).length - 1.

Чем отличается длина строки от количества байт?

Длина строки – это число символов (кодовых точек). Количество байт зависит от кодировки: символ “A” в UTF-8 занимает 1 байт, а “Я” – 2 байта, эмодзи – до 4 байт.

Как учесть регистр при подсчёте символов?

Приведите строку к одному регистру перед подсчётом: lower() в Python или toLowerCase() в JavaScript. Тогда “A” и “a” будут считаться как один символ.

Как посчитать уникальные символы в строке?

Преобразуйте строку в множество: len(set(“hello”)) в Python даст 4 уникальных символа. Множество автоматически убирает дубликаты.

Почему длина строки с эмодзи может считаться неправильно?

Некоторые эмодзи состоят из нескольких кодовых точек (суррогатные пары, модификаторы тона кожи). Функция len() считает кодовые точки, а не визуальные символы. Используйте специальные библиотеки или графемные кластеры.

Как посчитать частоту каждого символа в строке?

В Python используйте collections.Counter(“hello”) – получите словарь с количеством каждого символа. Вручную – создайте объект и увеличивайте счётчик для каждого символа в цикле.

  1. Рандомно от 1 до 100: генерация случайного числа в JavaScript
  2. Как посчитать сумму чисел в Python: простые способы
  3. 15 случайных чисел: генератор онлайн и код JavaScript
  4. Рандомный массив: генератор и примеры на JavaScript
  5. Рандомно 2 числа: генерация случайных чисел в JavaScript
  6. Генератор рандомных секунд | JavaScript