Regex.EnumerateSplits
В 6м превью .NET 9 представлен новый метод класса Regex, который позволяет разбивать входные данные по шаблону без выделения памяти.
Класс Regex предоставляет метод Split, по концепции аналогичный методу String.Split. С помощью String.Split вы предоставляете один или несколько разделителей (символов или строк), и реализация разбивает входной текст по этим разделителям. Вот пример использования String.Split:
foreach (var s in "Hello, world! How are you?".Split('w'))
{
Console.WriteLine(s);
}который выводит:
Hello,
orld! Ho
are you?
Regex предоставляет аналогичный метод Split, но вместо указания разделителя в виде символа или строки он указывается как шаблон регулярного выражения:
foreach (var s in Regex.Split(
"Hello, world! How are you?", "[aeiou]"))
{
Console.WriteLine(s);
}
Вывод:
H
ll
, w
rld! H
w
r
y
?
Однако Regex.Split принимает в качестве входных данных только строки и не поддерживает входные данные в виде ReadOnlySpan<char>, а также выводит полный набор результатов в виде массива строк, что требует выделения как массива строк для хранения результатов, так и выделения строк для каждого результата. В .NET 9 новый метод EnumerateSplits позволяет выполнять ту же операцию, но с входными данными в виде ReadOnlySpan<char> и без какого-либо выделения памяти. Он принимает ReadOnlySpan<char> и возвращает перечислитель (ValueSplitEnumerator) результатов в виде диапазона (Range). В следующем примере показано использование Regex.EnumerateSplits:
ReadOnlySpan<char> input =
"Hello, world! How are you?";
foreach (Range r in
Regex.EnumerateSplits(input, "[aeiou]"))
{
Console.WriteLine($"{input[r]}");
}
Вывод будет такой же, как в предыдущем примере, но без выделения памяти. Здесь r – диапазон, например, {0..1} для первого результата, и на консоль выводится срез входных данных, соответствующий диапазону (это результат типа ReadOnlySpan<char>, поэтому он помещён в интерполированную строку для использования в Console.WriteLine.
Источник: https://github.com/dotnet/core/blob/main/release-notes/9.0/preview/preview6/libraries.md