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





Для этого нет встроенного метода. Если вы разделяете по одному шаблону, это можно закодировать с помощью следующих
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>! », верно?
кроме того, это не сработает, если у вас будет несколько возможных разделителей.
@Meidan, я явно назвал это одним шаблоном anwser
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
Для ясности: если у вас есть строка "foo, bar", вы хотите, чтобы результатом была строка [0] ", foo" и строка [1] ", bar"?