String.Split вариация в C # - PullRequest
       11

String.Split вариация в C #

0 голосов
/ 15 января 2009

Я хочу использовать функцию Split для строки, но сохранить последовательность-разделитель в качестве первых символов в каждом элементе массива строк. Я использую эту функцию для разделения HTML на каждый экземпляр URL, чтобы я мог запускать шаблоны регулярных выражений для URL на веб-сайте. Есть ли какие-либо перегрузки функции split для этого? или я должен написать свою собственную функцию?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 15 января 2009
    public static string[] SplitAndKeepDelimiters(this string Original, string[] Delimeters, StringSplitOptions Options)
    {
        var strings = EnumSplitAndKeepDelimiters(Original, Delimeters);

        if (Options == StringSplitOptions.RemoveEmptyEntries)
        {
            return strings.Where((s) => s.Length != 0).ToArray();
        }
        else
        {
            return strings.ToArray();
        }
    }

    static IEnumerable<string> EnumSplitAndKeepDelimiters(this string Original, string[] Delimeters)
    {
        int currIndex = 0;

        while (currIndex < Original.Length)
        {
            var delimiterIndex = Delimeters.Select((d) => new { Source = d, Index = Original.IndexOf(d, currIndex) })
                .Where((d) => (d.Index != -1) && (d.Source != string.Empty) )
                .OrderBy((d) => d.Index)
                .FirstOrDefault();
        int nextIndex = (delimiterIndex != null ) ? delimiterIndex.Index + delimiterIndex.Source.Length : Original.Length;
            yield return Original.Substring(currIndex, nextIndex - currIndex);
            currIndex = nextIndex;
        }
    }
3 голосов
/ 15 января 2009

Нет встроенного метода для этого. Если вы разбиваете на один шаблон, это может быть закодировано следующим

public IEnumerable<string> SplitAndKeepPrefix(this string source, string delimeter) {
  return SplitAndKeepPrefix(source, delimeter, StringSplitOptions.None);
}

public IEnumerable<string> SplitAndKeepPrefix(this string source, string delimeter, StringSplitOptions options ) {
  var split = source.Split(delimeter, options);
  return split.Take(1).Concat(split.Skip(1).Select(x => delimeter + x));
}

string result = htmlStr.SplitAndKeepPrefix("<a");

EDIT

Обновлено, чтобы не указывать префикс каждой строки:)

0 голосов
/ 15 января 2009

Ответ: нет, вам придется выкатить собственную версию.

Информацию об API String.Split можно найти на MSDN

0 голосов
/ 15 января 2009

Насколько я знаю, это невозможно при использовании метода Split по умолчанию. Вы можете написать метод расширения, чтобы решить вашу проблему. Или просто переберите строку [] и поместите разделитель перед каждой строкой.

Я бы пошел за метод расширения:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...