String.Split VS. Regex.Split? - PullRequest
       25

String.Split VS. Regex.Split?

14 голосов
/ 30 августа 2010

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

Могу ли я увидеть прирост производительности с одним против другого?

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

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

Ответы [ 4 ]

14 голосов
/ 30 августа 2010

Regex.Split более эффективен, но для договоренности с базовым разделением (с использованием символа, который не будет больше нигде в строке), с функцией String.Split работать намного проще.

Что касается производительности, вам придется создать тест и попробовать его. Но не оптимизируйте заранее, если только вы не знаете , что эта функция станет узким местом для какого-то важного процесса.

4 голосов
/ 30 августа 2010

По умолчанию я бы достиг String.Split, если у вас нет сложных требований, которые регулярное выражение позволит вам перемещаться. Конечно, как уже упоминалось, профилируйте его для своих нужд. Обязательно профилируйте с RegexOptions.Compiled и без него и поймите, как это работает. Посмотрите на Компилировать или не компилировать , Как работает RegexOptions.Compiled? и найдите другие статьи по этой теме.

Одним из преимуществ String.Split является его StringSplitOptions.RemoveEmptyEntries, который удаляет пустые результаты для случаев, когда между разделителями нет данных. Шаблон регулярного выражения той же строки / символа с разделением будет иметь избыточные пустые записи. Это незначительно и может быть обработано простым запросом 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?

0 голосов
/ 30 августа 2010
  1. Для простого разделителя следует использовать String.Split, например, адреса электронной почты, разделенные запятыми.
  2. Для сложного разделителя (используйте Regex), например, если в кавычках есть разделитель, он не долженразделенные, например, A, B = два токена, A & B "A, B" = один токен, игнорировать запятую в кавычках
  3. Включать разделители в соответствии с предложением Ахмада

один будет работать быстрее, это очень субъективно.Regex будет работать быстрее при выполнении, однако время компиляции и установки Regex будет больше при создании экземпляра.Но если вы вначале сохраните готовый объект регулярного выражения, повторное использование того же регулярного выражения для выполнения разбиения будет быстрее.

String.Split не требует никакого времени установки, но это чисто последовательная операция поиска, она будет работать медленнеедля большого текста.

0 голосов
/ 30 августа 2010

Основная причина использования Regex.Split заключается в его гибкости.Используя String.Split, вы можете указать только один символ-разделитель, когда Regex.Split предоставляет всю мощь регулярных выражений для разделения строк.В простейших случаях String.Split должно быть быстрее (потому что нет необходимости в сборке автоматов и т. Д.)

...