Разделение строки и игнорирование разделителя внутри кавычек

Я использую строку .NET.Метод Split для разбиения строки с помощью запятых, но я хочу игнорировать строки, заключенные в двойные кавычки для строки. Я читал, что a

например, строка ниже.

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 ответов


вы лучше с парсером, как те, которые упомянуты в комментариях. Тем не менее, это можно сделать с regex следующим образом:

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

положительный lookahead ((?= ... )) гарантирует, что есть четное количество кавычек перед запятой для разделения (т. е. либо они встречаются в парах, либо их нет).

[^"]* играм не-кавычки.


быстрый обходной путь может быть предварительно разобрать запятые внутри кавычек и заменить их другим разделителем, разделить значения и после разбора значений с разделителем, заменив его исходными запятыми.


Я нашел ниже самый простой способ, мы можем это сделать

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<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

Бананы, Апельсины, Виноград