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

时间:2014-01-21 14:46:07

标签: c# .net regex vb.net csv

我使用.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

4 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:3)

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

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("\"", "")

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

输出:

水果

10

香蕉,橘子,葡萄