2012-02-29 97 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