Вариант String.Split в C#

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

Спасибо!

Для ясности: если у вас есть строка "foo, bar", вы хотите, чтобы результатом была строка [0] ", foo" и строка [1] ", bar"?

BFree 15.01.2009 18:39

какую версию .NET Framework вы используете? Предлагаемые ниже методы расширения работают в .NET 3.5 Framework.

Gavin Miller 15.01.2009 18:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
1 801
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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");

РЕДАКТИРОВАТЬ

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

Не похоже, что вы правильно обрабатываете первый элемент. Строка «Проверить <a href='example.com '> это ссылку</a>!» приведет к появлению элементов «<a Check out» и «<a href='example.com '> это link</a>! », верно?

Matthew Maravillas 15.01.2009 18:45

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

Meidan Alon 15.01.2009 18:46

@Meidan, я явно назвал это одним шаблоном anwser

JaredPar 15.01.2009 19:05
    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;
        }
    }

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

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

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

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

Другие вопросы по теме