@ ojlovecd имеет хороший ответ, используя регулярные выражения.
Однако его ответ слишком сложен, поэтому вот мой аналогичный, более простой ответ.
public string[] StringToArray(string input) {
var pattern = new Regex(@"
\[
(?:
\s*
(?<results>(?:
(?(open) [^\[\]]+ | [^\[\],]+ )
|(?<open>\[)
|(?<-open>\])
)+)
(?(open)(?!))
,?
)*
\]
", RegexOptions.IgnorePatternWhitespace);
// Find the first match:
var result = pattern.Match(input);
if (result.Success) {
// Extract the captured values:
var captures = result.Groups["results"].Captures.Cast<Capture>().Select(c => c.Value).ToArray();
return captures;
}
// Not a match
return null;
}
Используя этот код, вы увидите, что StringToArray("[a, b, [c, [d, e]], f, [g, h], i]")
вернет следующий массив: ["a", "b", "[c, [d, e]]", "f", "[g, h]", "i"]
.
Для получения дополнительной информации о сбалансированных группах, которые я использовал для сопоставления сбалансированных фигурных скобок, посмотрите документацию Microsoft .
Обновление
Согласно комментариям, если вы хотите также сбалансировать кавычки, вот возможная модификация. (Обратите внимание, что в C # "
экранируется как ""
) Я также добавил описания шаблона, чтобы помочь прояснить его:
var pattern = new Regex(@"
\[
(?:
\s*
(?<results>(?: # Capture everything into 'results'
(?(open) # If 'open' Then
[^\[\]]+ # Capture everything but brackets
| # Else (not open):
(?: # Capture either:
[^\[\],'""]+ # Unimportant characters
| # Or
['""][^'""]*?['""] # Anything between quotes
)
) # End If
|(?<open>\[) # Open bracket
|(?<-open>\]) # Close bracket
)+)
(?(open)(?!)) # Fail while there's an unbalanced 'open'
,?
)*
\]
", RegexOptions.IgnorePatternWhitespace);