Подсчитать кол-во слов в строке C#

344
08 апреля 2018, 23:12

Нужно в тексте подсчитать количество определенных слов, например:

Словом можно убить, словом можно спасти.

Нужно посчитать, сколько раз в строке(или тексте) встречается слово "Словом", и записать результат в переменную.

Answer 1

Для разделения строки на слова можно воспользоваться методом Split и передать в параметре символы для деления.

String s = "Словом можно убить, словом можно спасти.";
String sSearch = "словом";
String[] words = s.Split(new char[] { ' ', ',' });
int counter = 0;
foreach (var word in words)
{
    if (sSearch == word.ToLower())
        counter++;
}
Console.WriteLine(counter);
Console.ReadKey();
Answer 2

А я бы сделал так:

Есть к примеру у нас строка:

string str = "Словом можно убить, словом можно спасти.";

Нам надо для начала перевести ее в нижний регистр (ToLower()), далее разбить на слова. Как на мой взгляд это хорошо делает Regex.Split (ибо ему не надо задавать все знаки для "разбития"). Ну и дальше, имея массив всех слов, мы можем сгруппировать их и составить новую коллекцию, которая будет содержать кол-во найденных слов и само слово. Исходя из этого, наша строка будет примерно следующей:

var words = Regex.Split(str.ToLower(), @"\W+")
    .Where(x => !string.IsNullOrEmpty(x))
    .GroupBy(g => g)
    .Select(s => new {Word = s.Key, Count = s.Count()});

Собственно все. Можно теперь смело выводить все, что нам требуется:

var count = words.FirstOrDefault(x => x.Word == "словом")?.Count;

Если нам не нужно знать о других словах, то можно немного переписать:

var words = Regex.Split(str.ToLower(), @"\W+")
    .Where(x => x == "словом")
    .GroupBy(g => g)
    .Select(s => new {Word = s.Key, Count = s.Count()})
    .FirstOrDefault()?.Count;

* Select в данном примере является неким удобством, что бы мы знали и слово и кол-во найденных соответствий. На выходе получим int?, который вернет число найденных слов, либо null, если такого слова не найдено.

Ну, если нужно просто кол-во слов, то можно вообще поступить следующим образом:

int words = Regex.Split(str.ToLower(), @"\W+").Count(x => x == "словом");
Answer 3

Постройте на основе слова регулярку вида \bслово\b и посчитайте количество совпадений. \b - это граница слова. Слово прогоните через Regex.Escape, чтобы экранировать спецсимволы.

using System.Text.RegularExpressions;
....
string source = "Словом можно убить, словом можно спасти.";
string word = "словом";
int count = Regex.Matches(
    source,
    $"\\b{Regex.Escape(word)}\\b", RegexOptions.IgnoreCase)
    .Count; // 2
Answer 4

Всё предельно просто, ищем количество вхождений подстроки регулярным выражением.

using System.Text.RegularExpressions;

Метод:

private int countWord(string source, string search)
{
    string pattern = $"\\b{Regex.Escape(search)}\\b";
    return new Regex(pattern, RegexOptions.IgnoreCase).Matches(source).Count;
}

Применение:

int count = countWord("Словом можно убить, словом можно спасти.", "словом");
READ ALSO
Лямбда выражения в c# ASP.NET MVC

Лямбда выражения в c# ASP.NET MVC

В учебном материале есть такой листинг:

198
Как SVG сконвертировать в JPG или PNG на C#?

Как SVG сконвертировать в JPG или PNG на C#?

Я генерирую SVG файлы на C#, необходимо используя C# отрендерить их в JPG или PNGКак это можно сделать?

219
Почему приходит пустая строка?

Почему приходит пустая строка?

Добрый день, отсылаю серверу данные:

189