Еще один способ реализовать то, что делал Snowbear:
public static string[] SplitNest(this string s, char src, string nest, string trg)
{
int scope = 0;
if (trg == null || nest == null) return null;
if (trg.Length == 0 || nest.Length < 2) return null;
if (trg.IndexOf(src) >= 0) return null;
if (nest.IndexOf(src) >= 0) return null;
for (int i = 0; i < s.Length; i++)
{
if (s[i] == src && scope == 0)
{
s = s.Remove(i, 1).Insert(i, trg);
}
else if (s[i] == nest[0]) scope++;
else if (s[i] == nest[1]) scope--;
}
return s.Split(trg);
}
Идея состоит в том, чтобы заменить любой не вложенный разделитель другим разделителем, который затем можно использовать обычным string.Split()
.Вы также можете выбрать тип используемого кронштейна - ()
, <>
, []
или даже что-то странное, например \/
, ][
или `'
.Для ваших целей вы должны использовать
string str = "adj_con(CL2,1,3,0),adj_cont(CL1,1,3,0),NG, NG/CL, 5 value of CL(JK), HO";
string[] result = str.SplitNest(',',"()","~");
Функция сначала превратит вашу строку в
adj_con(CL2,1,3,0)~adj_cont(CL1,1,3,0)~NG~ NG/CL~ 5 value of CL(JK)~ HO
, а затем разделит на ~
, игнорируя вложенные запятые.