Разделение строки и игнорирование разделителя внутри кавычек
Я использую строку .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
Бананы, Апельсины, Виноград