Поиск нескольких индексов из исходной строки - PullRequest
6 голосов
/ 20 апреля 2009

В основном мне нужно сделать String.IndexOf () и мне нужно получить массив индексов из исходной строки.

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

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

Ответы [ 4 ]

16 голосов
/ 20 апреля 2009

Как насчет этого метода расширения:

public static IEnumerable<int> IndexesOf(this string haystack, string needle)
{
    int lastIndex = 0;
    while (true)
    {
        int index = haystack.IndexOf(needle, lastIndex);
        if (index == -1)
        {
            yield break;
        }
        yield return index;
        lastIndex = index + needle.Length;
    }
}

Обратите внимание, что при поиске "AA" в "XAAAY" этот код теперь будет давать только 1.

Если вам действительно нужен массив, вызовите ToArray() для результата. (Это предполагает .NET 3.5 и, следовательно, поддержку LINQ.)

6 голосов
/ 20 апреля 2009
    var indexs = "Prashant".MultipleIndex('a');

//Extension Method's Class
    public static class Extensions
    {
         static int i = 0;

         public static int[] MultipleIndex(this string StringValue, char chChar)
         {

           var indexs = from rgChar in StringValue
                        where rgChar == chChar && i != StringValue.IndexOf(rgChar, i + 1)
                        select new { Index = StringValue.IndexOf(rgChar, i + 1), Increament = (i = i + StringValue.IndexOf(rgChar)) };
            i = 0;
            return indexs.Select(p => p.Index).ToArray<int>();
          }
    }
6 голосов
/ 20 апреля 2009

Вы должны были бы зациклить, я подозреваю:

        int start = 0;
        string s = "abcdeafghaji";
        int index;
        while ((index = s.IndexOf('a', start)) >= 0)
        {
            Console.WriteLine(index);
            start = index + 1;
        }
2 голосов
/ 08 апреля 2016

Использование решения с использованием регулярных выражений может быть более надежным, а использование функции indexOf может быть ненадежным. Он найдет все совпадения и индексы, не соответствующие точной фразе, что может привести к неожиданным результатам. Эта функция решает эту проблему, используя библиотеку Regex.

public static IEnumerable<int> IndexesOf(string haystack, string needle)
{
       Regex r = new Regex("\\b(" + needle + ")\\b");
       MatchCollection m = r.Matches(haystack);

       return from Match o in m select o.Index;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...