String.Split VS. Regex.Split?
It seems that for simple scenarios string.Split()
would work much better. I ran a test in Benchmark .NET
Tested on .NetCore 2.2.6:
Method | Mean | Error | StdDev | Median |
---|---|---|---|---|
RegexSplit | 486.47 ns | 9.769 ns | 24.15 ns | 481.72 ns |
Split | 84.76 ns | 4.503 ns | 13.21 ns | 81.12 ns |
Tested on .Net 5.0.101:
Method | Mean | Error | StdDev |
---|---|---|---|
RegexSplit | 182.10 ns | 2.091 ns | 1.956 ns |
Split | 50.29 ns | 0.709 ns | 0.663 ns |
note: not run on the same hardware, so the relative differences in performance between dotnet versions is more important than the absolute differences.
The Test:
public class RegexVsSplit
{
private readonly string data = "host:7000";
public RegexVsSplit()
{
}
[Benchmark]
public string[] RegexSplit() => Regex.Split(data, ":");
[Benchmark]
public string[] Split() => data.Split(':');
}
Regex.Split is more capable, but for an arrangement with basic delimitting (using a character that will not exist anywhere else in the string), the String.Split function is much easier to work with.
As far as performance goes, you would have to create a test and try it out. But, don't pre-optimize, unless you know that this function will be the bottleneck for some essential process.
By default I would reach for String.Split
unless you have some complicated requirements that a regex would enable you to navigate around. Of course, as others have mentioned, profile it for your needs. Be sure to profile with and without RegexOptions.Compiled
too and understand how it works. Look at To Compile or Not To Compile, How does RegexOptions.Compiled work?, and search for other articles on the topic.
One benefit of String.Split
is its StringSplitOptions.RemoveEmptyEntries
that removes empty results for cases where no data exists between delimiters. A regex pattern of the same split string/char would have excess empty entries. It's minor and can be handled by a simple LINQ query to filter out String.Empty
results.
That said, a regex makes it extremely easy to include the delimiter if you have a need to do so. This is achieved by adding parentheses ()
around the pattern to make it a capturing group. For example:
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);
You might find this question helpful as well: How do I split a string by strings and include the delimiters using .NET?