我有一個字符串,我想這個字符串分割成一個數組如下:如何使用嵌入帶引號的字符串拆分逗號分隔的字符串?
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