String.Split VS. Regex.Split?
Если у меня есть текстовый файл с разделителем с основным разделителем (например, |
), имеет ли значение различие между String
или Regex
?
Я видел бы прирост производительности с одним и другим?
Я предполагаю, что вы захотите использовать Regex.Split
, если у вас есть разделители escaped
, которые вы не хотите разделять (например, \|
).
Есть ли другие причины использовать Regex.Split
vs String.Split
?
Ответы
Ответ 1
Regex.Split более способен, но для компоновки с базовым разграничением (с использованием символа, который не будет существовать нигде в строке), функция String.Split намного проще работать.
Что касается производительности, вам нужно будет создать тест и попробовать его. Но не предварительно оптимизируйте, если вы не знаете, что эта функция станет узким местом для какого-то существенного процесса.
Ответ 2
По умолчанию я бы достиг уровня String.Split
, если у вас нет сложных требований к тому, чтобы регулярное выражение позволяло вам перемещаться. Конечно, как отмечали другие, проконсультируйтесь с ним для ваших нужд. Обязательно выполните профиль с помощью RegexOptions.Compiled
и поймите, как это работает. Посмотрите Компилировать или не компилировать, Как работает RegexOptions.Compiled?, и искать другие статьи по теме.
Одним из преимуществ String.Split
является его StringSplitOptions.RemoveEmptyEntries
, который удаляет пустые результаты для случаев, когда между разделителями нет данных. У шаблона регулярных выражений одной и той же разделительной строки / char будут избыточные пустые записи. Он незначительный и может обрабатываться простым запросом LINQ для фильтрации результатов String.Empty
.
Тем не менее, регулярное выражение очень легко включает разделитель, если вам нужно это сделать. Это достигается добавлением круглых скобок ()
вокруг шаблона, чтобы сделать его группой захвата. Например:
string input = "a|b|c|d|e|f";
foreach (var s in Regex.Split(input, @"\|"))
Console.WriteLine(s);
Console.WriteLine("Include delimiter...");
// notice () around pattern
foreach (var s in Regex.Split(input, @"(\|)"))
Console.WriteLine(s);
Вы также можете найти этот вопрос полезным: Как разделить строку по строкам и включить разделители с помощью .NET?
Ответ 3
Основной причиной использования Regex.Split
является гибкость. Используя String.Split
, вы можете указать только один символ разделителя, если Regex.Split
предоставляет всю силу регулярных выражений для разделения строк. В простейших случаях String.Split
должен быть быстрее (потому что нет накладных расходов на создание автоматов и т.д.)
Ответ 4
- Для простого seperator вы должны использовать String.Split, например, разделенные запятыми адреса электронной почты.
- Для сложного seperator (используйте Regex), например, если у вас есть разделитель в кавычках, его не следует разделять, например
A, B = Два токена, A и B
"A, B" = один токен, игнорировать запятую внутри кавычек
- Чтобы включить ограничители, предложенные Ахмадом
Какой из них будет работать быстрее, он очень субъективен. Regex будет работать быстрее при выполнении, однако время компиляции и время компоновки Regex будет больше в создании экземпляра. Но если вы сохраните свой объект регулярного выражения в начале, повторное использование такого же регулярного выражения для разделения будет быстрее.
String.Split не требует никакого времени установки, но это чистая операция последовательного поиска, она будет работать медленнее для большого текста.