拆分字符串并忽略引号内的分隔符

我使用.NET的String.Split方法使用逗号分解字符串,但我想忽略用双引号括起来的字符串。 我读过那个

例如,下面的字符串。

Fruit,10,"Bananas, Oranges, Grapes" 

我想得到以下内容

 Fruit 10 "Bananas, Oranges, Grapes" 

目前我得到以下输出

 Fruit 10 "Bananas Oranges Grapes" enter code here 

在提出以下建议和答案之后,这里是我最终得到的样本。 (显然对我有用)

 Imports Microsoft.VisualBasic.FileIO Dim fileReader As New TextFieldParser(fileName) fileReader.TextFieldType = FieldType.Delimited fileReader.SetDelimiters(",") fileReader.HasFieldsEnclosedInQuotes = True While fileReader.EndOfData = False Dim columnData() As String = fileReader.ReadFields ' Processing of field data End While 

你最好使用解析器,就像评论中提到的那样。 也就是说,可以通过以下方式使用正则表达式来实现:

 ,(?=(?:[^"]*"[^"]*")*[^"]*$) 

正向前瞻( (?= ... ) )确保在逗号之前存在偶数引号以进行拆分(即它们成对出现,或者没有出现)。

[^"]*匹配非引号字符。

我发现下面是最简单的方法,我们可以做到

 string fruits = "Fruit,10,"Bananas, Oranges, Grapes""; string[] fruitsArr = Regex.Split(fruits, ",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))"); 

输出:

 fruitsArr[0] = "Fruit" fruitsArr[1] = "10" fruitsArr[2] = "\"Bananas, Oranges, Grapes\"" 

如果您需要纯字符串数据,那么您可以这样做,

fruitsArr[2].Replace("\"", "")

快速解决方法可以预先解析引号内的逗号并将其替换为另一个分隔符,拆分值并使用分隔符对值进行后解析,并将其替换为原始逗号。

如果使用c#,你可以使用

  string searchQuery = "Fruit,10,\"Bananas, Oranges, Grapes\""; List list1 = Regex.Matches(searchQuery, @"(?\w+)|\""(?[\w\s,]*)""").Cast().Select(m => m.Groups["match"].Value).ToList(); foreach(var v in list1) Console.WriteLine(v); 

输出:

水果

10

香蕉,橘子,葡萄