Я пытаюсь создать программу, которая строит строку слов, а затем находит эти слова в той же строке.

Первая половина вопроса работает, но у меня проблемы со второй. Программа находит слова, первый раз и последний, но как я могу найти среднее слово? А потом, как их считать?

        string strfinal;
        string frase = "", texto = "";
        string textoAEncontrar;
        Console.WriteLine("Insira algum texto (carregue no * para terminar a escrita): ");

        for (texto = ""; !texto.Equals("*");)
        {
            texto = Console.ReadLine();
            if (texto.Length < 100)
            {
                frase = frase + " " + texto;
            }
        }


        strfinal = frase.Substring(1, frase.Length - 2);

        Console.WriteLine(strfinal);

        Console.WriteLine("O que deseja encontrar no texto escrito: ");
        textoAEncontrar = Console.ReadLine();
        int primeiraReferenciaNoTexto = strfinal.IndexOf(textoAEncontrar);
        int ultimaReferenciaNoTexto = strfinal.LastIndexOf(textoAEncontrar);


        if (strfinal.Contains(textoAEncontrar))
            {

                Console.WriteLine("A palavra {0} existe no index {1}", textoAEncontrar, primeiraReferenciaNoTexto);
                Console.WriteLine("A palavra {0} existe no index {1}", textoAEncontrar, ultimaReferenciaNoTexto);
            }
            else
            {
                Console.WriteLine("A palavra {0} não existe", textoAEncontrar);
            }



    }
}
c#
-1
Bruno Dias 7 Сен 2016 в 02:41

3 ответа

Лучший ответ

Вам необходимо объединить вызовы IndexOf в цепочку, например:

var i = -1
while (true)
{
     i = strFinal.IndexOf(textoAEncontrar, i+1);
     if (i == -1) break;
     Console.WriteLine("Found string at {0}", i);
}

Возможно, вам потребуется улучшить проверки границ выше, но это общая идея.

1
John Wu 6 Сен 2016 в 23:52

В такое время вам определенно понадобится RegEx. У RegEx есть .Match, который может быть именно тем, что вам нужно.

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        Regex regex = new Regex(@"\d+");
        Match match = regex.Match("Dot 55 Perls");
        if (match.Success)
        {
            Console.WriteLine(match.Value);
        }
    }
}

Поскольку мы ищем числовые значения из строки, мы получим 55

Дополнительные пояснения по этому поводу см. По ссылкам ниже:

http://www.dotnetperls.com/regex

https://stackoverflow.com/a/2159085/5694113

0
Community 23 Май 2017 в 12:16

Вы можете создать метод, который получает индекс n-го вхождения слова в строке. Вы также можете использовать text.Split для подсчета количества вхождений, поскольку у вас есть разделитель символьного пространства.

        static void Main(string[] args)
        {    
            string text = "apple cinder apple goat apple";
            string searchWord = "apple";

            string[] textSplit = text.Split(' ');

            int searchResultCount = textSplit.Where(s => s == searchWord).Count();

            Console.WriteLine(text);
            Console.WriteLine(searchWord);
            Console.WriteLine(searchResultCount);
            Console.WriteLine(IndexOfOccurence(text, searchWord, 2));

            Console.ReadLine();
        }

        static int IndexOfOccurence(string s, string match, int occurence)
        {
            int i = 1;
            int index = 0;

            while (i <= occurence && (index = s.IndexOf(match, index)) != -1)
            {
                if (i == occurence)
                   return index;
                index++;
                i++;
            }

            return -1;
        }
0
jegtugado 7 Сен 2016 в 00:04