2012-02-29 93 views
1

我有一个字符串,我想这个字符串分割成一个数组如下:如何使用嵌入带引号的字符串拆分逗号分隔的字符串?

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

您正在描述[CSV格式](http://tools.ietf.org/html/rfc4180)。使用[CSV解析器](http://stackoverflow.com/search?q=%5Bc%23%5D+csv)。 – dtb 2012-02-29 11:20:25

回答

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)*$ 
4

这看起来像CSV - 这不是那么简单解析(考虑到逃跑时)。

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

有很多选择,例如FileHelpers

+0

它与csharp @ Oded – Pramod 2012-02-29 11:33:54

+0

@Pramod相关 - 它是一个.NET程序集,可以被任何_any_ .NET语言使用。 – Oded 2012-02-29 11:55:22

+3

是的,命名空间是'VisualBasic',但没有任何区别,只需使用该类。我认为这是微软称这个命名空间为VisualBasic的最大错误之一。如果他们称之为'CoolHelpers',人们会更多地使用它,而不是重新发明这个错误命名空间的轮子原因。 – Oliver 2012-02-29 13:25:28