Подтвердить что ты не робот

String.Split VS. Regex.Split?

Если у меня есть текстовый файл с разделителем с основным разделителем (например, |), имеет ли значение различие между String или Regex?

Я видел бы прирост производительности с одним и другим?

Я предполагаю, что вы захотите использовать Regex.Split, если у вас есть разделители escaped, которые вы не хотите разделять (например, \|).

Есть ли другие причины использовать Regex.Split vs String.Split?

4b9b3361

Ответ 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 не требует никакого времени установки, но это чистая операция последовательного поиска, она будет работать медленнее для большого текста.