String.Split VS. Regex.Split?

Abe*_*ler 14 .net parsing split

如果我有一个带有基本分隔符的分隔文本文件(|例如),它是否会影响我是使用String还是Regex拆分?

我会看到一个与另一个的性能提升吗?

我假设你想要使用,Regex.Split如果你有escaped你不想拆分的分隔符(\|例如).

使用Regex.Splitvs 还有其他原因String.Split吗?

Joh*_*her 14

Regex.Split功能更强大,但对于具有基本分隔的排列(使用字符串中不存在的字符),String.Split函数更容易使用.

就性能而言,你必须创建一个测试并试一试.但是,不要预先优化,除非你知道这个功能将成为某些必要过程的瓶颈.


Ahm*_*eed 6

默认情况下,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);
Run Code Online (Sandbox Code Playgroud)

您可能会发现这个问题也很有帮助:How do I split a string by strings and include the delimiters using .NET?


Tja*_*art 6

似乎对于简单的场景string.Split()会更好。我在 Benchmark .NET 中进行了测试

在 .NetCore 2.2.6 上测试:


方法 意思 错误 标准差 中位数
正则表达式拆分 486.47 纳秒 9.769 纳秒 24.15 纳秒 481.72 纳秒
分裂 84.76 纳秒 4.503 纳秒 13.21 纳秒 81.12 纳秒

在 .Net 5.0.101 上测试:


方法 意思 错误 标准差
正则表达式拆分 182.10 纳秒 2.091 纳秒 1.956 纳秒
分裂 50.29 纳秒 0.709 纳秒 0.663 纳秒

注意:不是在同一个硬件上运行,所以 dotnet 版本之间的性能相对差异比绝对差异更重要。

考试:

public class RegexVsSplit
{
    private readonly string data = "host:7000";

    public RegexVsSplit()
    {
    }

    [Benchmark]
    public string[] RegexSplit() => Regex.Split(data, ":");

    [Benchmark]
    public string[] Split() => data.Split(':');
}
Run Code Online (Sandbox Code Playgroud)

  • 对于未来的读者,请注意,新的 .Net Core / .NET 5.0 Preview 6 改进了 RegEx(以及许多其他领域)的性能,因此您最好像 @Tjaart 那样进行另一个基准测试。 (3认同)