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

#c# #string #char

#c# #строка #символ

Вопрос:

Я хочу найти количество букв «a» только в первом предложении. Приведенный ниже код находит «a» во всех предложениях, но я хочу только в первом предложении.

 static void Main(string[] args)
{
    string text;  int k = 0;
    text = "bla bla bla. something second. maybe last sentence.";

    foreach (char a in text)
    {
        char b = 'a';
        if (b == a)
        {
            k  = 1;
        }
    }

    Console.WriteLine("number of a in first sentence is "   k);
    Console.ReadKey();
}
  

Комментарии:

1. Пожалуйста, просмотрите свой код, пока не сможете задать более конкретный вопрос.

2. Сначала вы должны определить первое предложение. Изолируйте это. Тогда найти первую букву «a» тривиально. К сожалению, точная идентификация предложения действительно может быть нетривиальной.

3. Как вы определяете предложение? Точка может встречаться в самых разных местах… например, 1.5 или «Она сказала: «Вау».

Ответ №1:

Это разделит строку на массив, разделенный символом ‘.’, затем подсчитывает количество символов ‘a’ в первом элементе массива (первое предложение).

 var count = Text.Split(new[] { '.', '!', '?', })[0].Count(c => c == 'a');
  

В этом примере предполагается, что предложение разделено символом ., ? или !. Если в вашей строке есть десятичное число (например, 123.456), это будет считаться разрывом предложения. Разбиение строки на точные предложения — довольно сложное упражнение.

Комментарии:

1. Я бы включил ‘!’ и ‘?’ в качестве аргументов разделения, но в остальном это самый элегантный способ сделать это.

2. Хороший ответ, укажите случай, когда введенный текст не содержит «.», для моего одобрения.

3. Хороший ответ, короче и проще, чем мой. 1 для вас !! 🙂

4. Вызываем String. Разбиение на пустую строку вернет массив с пустой строкой с индексом 0. Вызывающая строка. Разбиение на строку, которая не соответствует ни одному из разделяемых символов, вернет всю строку с индексом 0 в массиве. Только что протестировано с использованием «abc» и «» в виде текста.

5. да, это была одна часть домашней работы. я буду помечать подобные вопросы как домашнее задание в другой раз :). Я новичок в этом, и в программировании тоже.

Ответ №2:

Это, возможно, более подробное, чем то, что вы искали, но, надеюсь, это приведет к пониманию по мере прочтения.

 public static void Main()
    {
        //Make an array of the possible sentence enders. Doing this pattern lets us easily update
        // the code later if it becomes necessary, or allows us easily to move this to an input
        // parameter
        string[] SentenceEnders = new string[] {"$", @".", @"?", @"!" /* Add Any Others */};
        string WhatToFind = "a"; //What are we looking for? Regular Expressions Will Work Too!!!
        string SentenceToCheck = "This, but not to exclude any others, is a sample."; //First example
        string MultipleSentencesToCheck = @"
        Is this a sentence
        that breaks up
        among multiple lines?
        Yes!
        It also has
        more than one
        sentence.
        "; //Second Example

        //This will split the input on all the enders put together(by way of joining them in [] inside a regular
        // expression.
        string[] SplitSentences = Regex.Split(SentenceToCheck, "["   String.Join("", SentenceEnders)   "]", RegexOptions.IgnoreCase);

        //SplitSentences is an array, with sentences on each index. The first index is the first sentence
        string FirstSentence = SplitSentences[0];

        //Now, split that single sentence on our matching pattern for what we should be counting
        string[] SubSplitSentence = Regex.Split(FirstSentence, WhatToFind, RegexOptions.IgnoreCase);

        //Now that it's split, it's split a number of times that matches how many matches we found, plus one
        // (The "Left over" is the  1
        int HowMany = SubSplitSentence.Length - 1;

        System.Console.WriteLine(string.Format("We found, in the first sentence, {0} '{1}'.", HowMany, WhatToFind));

        //Do all this again for the second example. Note that ideally, this would be in a separate function
        // and you wouldn't be writing code twice, but I wanted you to see it without all the comments so you can
        // compare and contrast

        SplitSentences = Regex.Split(MultipleSentencesToCheck, "["   String.Join("", SentenceEnders)   "]", RegexOptions.IgnoreCase | RegexOptions.Singleline);
        SubSplitSentence = Regex.Split(SplitSentences[0], WhatToFind, RegexOptions.IgnoreCase | RegexOptions.Singleline);
        HowMany = SubSplitSentence.Length - 1;

        System.Console.WriteLine(string.Format("We found, in the second sentence, {0} '{1}'.", HowMany, WhatToFind));
    }
  

Вот результат:

 We found, in the first sentence, 3 'a'.
We found, in the second sentence, 4 'a'.
  

Комментарии:

1. Очень надеюсь, что ваш производственный код написан не так. Вы зря тратите место на жестком диске на все это. 🙂

2. Пустая трата места на жестком диске? Из-за нескольких дополнительных символов? Вы должны посмотреть концепцию читаемого кода по сравнению с более коротким кодом — большинство согласны с тем, что читаемый / поддерживаемый намного лучше.

3. Я саркастично отозвался о пространстве на жестком диске. Однако — существует тонкая грань между нечитаемым кодом, читаемым кодом и слишком большим количеством кода. Помните — чем больше кода вы пишете для решения одной и той же проблемы, тем больше вероятность ошибок. Решение на основе LINQ, приведенное выше (одна строка), очень читабельно, а также коротко и привлекательно. Единственным недостатком решения со ссылкой было бы, если бы вам пришлось отлаживать его и проверять циклы — но в данном случае это кажется излишеством.

4. Извините — я полностью пропустил сарказм. =) И хотя «потенциальных строк» для ошибок больше, я также нахожу, что в целом ошибок меньше, потому что работа более интуитивно понятна и за ней легко следить. Тем не менее, у меня также нет проблем с примерами LINQ, но люди, новички в программировании, возможно, не смогут по-настоящему понять, что происходит, без такого рода прорыва.

Ответ №3:

Вы не определили «предложение», но если мы предположим, что оно всегда заканчивается точкой ( . ), просто добавьте это внутри цикла:

 if (a == '.') {
    break;
}
  

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

Комментарии:

1. Да, вам действительно нужно определить предложение. Остерегайтесь предложений типа «Однажды мистер Барнс пошел в магазин».

2. я так много думал об этом и знал, что это очень просто. спасибо, чувак, это работает.

Ответ №4:

Просто «разорвите» foreach(...) цикл, когда встретите «.» (точка)

Ответ №5:

Ну, предположим, вы определяете предложение как заканчивающееся на ‘.»

Используйте String.indexOf() для определения позиции первого ‘.’. После этого выполните поиск в подстроке, а не во всей строке.

Ответ №6:

  1. найдите место ‘.’ в тексте ( вы можете использовать разделение)
  2. подсчитайте ‘a’ в тексте от места 0 до экземпляра ‘.’

Ответ №7:

        string SentenceToCheck = "Hi, I can wonder this situation where I can do best";

      //Here I am giving several way to find this
        //Using Regular Experession

        int HowMany = Regex.Split(SentenceToCheck, "a", RegexOptions.IgnoreCase).Length - 1;
        int i = Regex.Matches(SentenceToCheck, "a").Count;
        // Simple way

        int Count = SentenceToCheck.Length - SentenceToCheck.Replace("a", "").Length;

        //Linq

        var _lamdaCount = SentenceToCheck.ToCharArray().Where(t => t.ToString() != string.Empty)
            .Select(t => t.ToString().ToUpper().Equals("A")).Count();

       var _linqAIEnumareable = from _char in SentenceToCheck.ToCharArray()
                                 where !String.IsNullOrEmpty(_char.ToString())
                                 amp;amp; _char.ToString().ToUpper().Equals("A")
                                 select _char;

        int a =linqAIEnumareable.Count;

        var _linqCount = from g in SentenceToCheck.ToCharArray()
                         where g.ToString().Equals("a")
                         select g;
        int a = _linqCount.Count();