我有一个字符串,我想这个字符串分割成一个数组如下:如何使用嵌入带引号的字符串拆分逗号分隔的字符串?
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(',');
我有一个字符串,我想这个字符串分割成一个数组如下:如何使用嵌入带引号的字符串拆分逗号分隔的字符串?
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(',');
使用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>[^,]*)
这符合a
和b
等表情都捕捉到相关部分的命名组item
。
这些表达式(允许调用它们A
和B
)用替换构造被组合并分组使用非捕获组:
(?:A|B)
允许把这种新的表达C
。然后整个表达式(再次使用非捕获组):
^C(?:,C)*$
这看起来像CSV - 这不是那么简单解析(考虑到逃跑时)。
我建议使用CSV解析器,例如位于Microsoft.VisualBasic.FileIO
命名空间的TextFieldParser
类。
有很多选择,例如FileHelpers。
您正在描述[CSV格式](http://tools.ietf.org/html/rfc4180)。使用[CSV解析器](http://stackoverflow.com/search?q=%5Bc%23%5D+csv)。 – dtb 2012-02-29 11:20:25