如果我有一个带有基本分隔符的分隔文本文件(例如|
),那么我使用String
还是Regex
分割会有所不同吗?
我会看到一个与另一个的性能提升吗?
我假设您希望使用Regex.Split
,如果您有escaped
分隔符,您不想分开(例如\|
)。
使用Regex.Split
vs String.Split
还有其他原因吗?
答案 0 :(得分:14)
Regex.Split功能更强大,但对于具有基本分隔的排列(使用字符串中不存在的字符),String.Split函数更容易使用。
就性能而言,你必须创建一个测试并试一试。但是,不要预先优化,除非你知道这个功能将成为某些基本过程的瓶颈。
答案 1 :(得分:4)
默认情况下,我会找到String.Split
,除非你有一些复杂的要求,正则表达式可以让你导航。当然,正如其他人所提到的那样,根据您的需求对其进行分析。请确保使用和不使用RegexOptions.Compiled
进行分析,并了解其工作原理。查看To Compile or Not To Compile,How does RegexOptions.Compiled work?,然后搜索有关该主题的其他文章。
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);
您可能会发现此问题也很有用:How do I split a string by strings and include the delimiters using .NET?
答案 2 :(得分:1)
在简单情况下,string.Split()
似乎会更好。我在Benchmark .NET中进行了测试
在.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 |
测试:
public class RegexVsSplit
{
private readonly string data = "host:7000";
public RegexVsSplit()
{
}
[Benchmark]
public string[] RegexSplit() => Regex.Split(data, ":");
[Benchmark]
public string[] Split() => data.Split(':');
}
答案 3 :(得分:0)
使用Regex.Split
的主要原因是它的灵活性。使用String.Split
只能在Regex.Split
提供正则表达式的所有功能来分隔字符串时指定单个分隔符。在最简单的情况下String.Split
应该更快(因为构建自动机等没有开销)。
答案 4 :(得分:0)
哪一个会更快地工作,这是非常主观的。 Regex的执行速度会更快,但Regex的编译时间和设置时间将更多地在实例创建中。但是如果你在开始时保持你的正则表达式对象准备就绪,重复使用相同的正则表达式进行拆分会更快。
String.Split不需要任何设置时间,但它是纯顺序搜索操作,对于大文本它会更慢。