Разбить строку, сохранив значения, заключенные в кавычки (.NET)

Я ищу способ, в.NET, разделить строку, игнорируя разделенные символы, которые находятся в кавычках (или другой разделитель). (Эта функциональность будет соответствовать тому, что делает типичный синтаксический анализатор CSV, если разделитель разделен запятой.) Я не уверен, почему эта способность не встроена String.Split(),

4 ответа

Решение

Вы можете использовать регулярное выражение для этого. Пример:

string test = @"this,i""s,a"",test";
string[] parts =
  Regex.Matches(test, @"(""[^""]*""|[^,])+")
  .Cast<Match>()
  .Select(m => m.Value)
  .ToArray();

foreach (string s in parts) Console.WriteLine(s);

Выход:

this
i"s,a"
test

Проверьте ответ Марка в этом посте:

Входной массив длиннее, чем количество столбцов в этой таблице. исключение

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

Если вы также хотите разрешить одиночную кавычку ('), измените выражение на @ "(" "[^" "]" "|' [^ ']' | [^ \ s]) +".

Если вы хотите удалить кавычки из строки, измените свой Select на.Select(m => m.Value.Trim(new char [] {'\'','"'}))).

Используя метод @Guffa, вот мое полное решение:

/// <summary>
/// Splits the string while preserving quoted values (i.e. instances of the delimiter character inside of quotes will not be split apart).
/// Trims leading and trailing whitespace from the individual string values.
/// Does not include empty values.
/// </summary>
/// <param name="value">The string to be split.</param>
/// <param name="delimiter">The delimiter to use to split the string, e.g. ',' for CSV.</param>
/// <returns>A collection of individual strings parsed from the original value.</returns>
public static IEnumerable<string> SplitWhilePreservingQuotedValues(this string value, char delimiter)
{
    Regex csvPreservingQuotedStrings = new Regex(string.Format("(\"[^\"]*\"|[^{0}])+", delimiter));
    var values =
        csvPreservingQuotedStrings.Matches(value)
        .Cast<Match>()
        .Select(m => m.Value.Trim())
        .Where(v => !string.IsNullOrWhiteSpace(v));
    return values;
}
Другие вопросы по тегам