String.Split VS. Regex.Split?

时间:2010-08-30 14:49:54

标签: .net parsing split

如果我有一个带有基本分隔符的分隔文本文件(例如|),那么我使用String还是Regex分割会有所不同吗?

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

我假设您希望使用Regex.Split,如果您有escaped分隔符,您不想分开(例如\|)。

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

5 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:4)

默认情况下,我会找到String.Split,除非你有一些复杂的要求,正则表达式可以让你导航。当然,正如其他人所提到的那样,根据您的需求对其进行分析。请确保使用和不使用RegexOptions.Compiled进行分析,并了解其工作原理。查看To Compile or Not To CompileHow 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)

  1. 对于简单的分隔符,您应该使用String.Split,例如逗号分隔的电子邮件地址。
  2. 对于复杂的分隔符(使用正则表达式),就像在引号中有分隔符一样,它不应该分开,例如 A,B =两个代币,A&乙 “A,B”=一个令牌,在引号内忽略逗号
  3. 包括艾哈迈德建议的分隔符
  4. 哪一个会更快地工作,这是非常主观的。 Regex的执行速度会更快,但Regex的编译时间和设置时间将更多地在实例创建中。但是如果你在开始时保持你的正则表达式对象准备就绪,重复使用相同的正则表达式进行拆分会更快。

    String.Split不需要任何设置时间,但它是纯顺序搜索操作,对于大文本它会更慢。