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

问题描述 投票:11回答:4

我使用.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
c# .net regex vb.net csv
4个回答
9
投票

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

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

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

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


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


1
投票

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


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

香蕉,橘子,葡萄

© www.soinside.com 2019 - 2024. All rights reserved.