如何用逗号分隔的字符串拆分逗号分隔的字符串?

时间:2012-02-29 11:18:34

标签: c# .net

我有一个字符串,我想将此字符串拆分为数组,如下所示:

string stemp = "a,b,c,\"d,e f\",g,h";
array[0] = a
array[1] = b
array[2] = c
array[3] = d,e f
array[4] = g
array[5] = h

我尝试过关注syntax

string array[] = null;
array = stemp.split(',');

2 个答案:

答案 0 :(得分:4)

这看起来像CSV - 解析时不那么简单(考虑转义时)。

我建议使用CSV解析器,例如Microsoft.VisualBasic.FileIO命名空间中的TextFieldParser类。

有许多替代方案,例如FileHelpers

答案 1 :(得分:3)

使用CSV解析器可能是正确的解决方案,但您也可以使用正则表达式:

var stemp = @"a,b,c,""d,e f"",g,h";
var regex = new Regex(@"^(?:""(?<item>[^""]*)""|(?<item>[^,]*))(?:,(?:""(?<item>[^""]*)""|(?<item>[^,]*)))*$");
var array = regex
  .Match(stemp)
  .Groups["item"]
  .Captures
  .Cast<Capture>()
  .Select(c => c.Value)
  .ToArray();

不幸的是,正则表达式往往难以理解,所以这里是对各个部分的简短描述:

""(?<item>[^""]*)""

匹配"d,e f"

(?<item>[^,]*)

这匹配ab等。两个表达式都捕获指定组item的相关部分。

这些表达式(让我们称之为AB)使用交替构造进行组合,并使用非捕获组进行分组:

(?:A|B)

让我们调用这个新表达式C。然后整个表达式(再次使用非捕获组):

^C(?:,C)*$