Найти строки в кавычках первого уровня, игнорируя вложенные в них кавычки - C#
Формулировка задачи:
Есть вот такая строка:
""дата "о дате"""""R'0'T'A'0'1'1'3'2"R'1'S'string here'"3"R'2'S'boxed string'"4"R'3'0'1'1"R'1'"2"R'2'"3"R'4'C'4'0'4'"R'2'""R'5'S'text value 2'""R'6'S'text value 3'""R'6'""4"R'7'C'3'0"R'8'S'list prop'"1'4'"R'9'S'text value 1'""R'5'""R'9'""5"R'10'0'1'1"R'1'"2"R'2'"""""
Очень страшная и некрасивая, мне необходимо поделить ее на части:""дата "о дате""""
"R'0'T'A'0'1'1'3'2"R'1'S'string here'"3"R'2'S'boxed string'"4"R'3'0'1'1"R'1'"2"R'2'"3"R'4'C'4'0'4'"R'2'""R'5'S'text value 2'""R'6'S'text value 3'""R'6'""4"R'7'C'3'0"R'8'S'list prop'"1'4'"R'9'S'text value 1'""R'5'""R'9'""5"R'10'0'1'1"R'1'"2"R'2'"""""
Данные постоянно меняются, они не статичны. Пробoвал такие варианты: @"(^"").*("")" @"(?![""]).*(?< ![""])" @"(^""[^""""]*"")(""""$)" @"^""([^""]*("")*(\\[^""])*)*"""Решение задачи: «Найти строки в кавычках первого уровня, игнорируя вложенные в них кавычки»
textual
Листинг программы
public static string[] Split(string str)
{
string partPattern = @"[A-Z0-9]+(')(?:''|[^'])*'";
string bodyPattern = @"[A-Z0-9]+("")|""";
int g = 0, n = 0;
var parts = Regex.Matches(str, partPattern).Cast<Match>().ToArray();
return Regex.Matches(str, bodyPattern).Cast<Match>()
.Where(x => !parts.Any(y =>
{
return x.Index >= y.Index &&
x.Index + x.Length <= y.Index + y.Length;
}))
.Concat(parts)
.OrderBy(x => x.Index)
.GroupBy(x =>
{
string s = x.Groups[1].Value;
if(n == 0 && (s == "'" || s == "\"")) g++;
if(s == "\"") n++;
if(x.Value == "\"") n--;
return g;
})
.Select(x =>
{
Match m1 = x.First();
Match m2 = x.Last();
return m1 == m2
? str.Substring(m1.Index, m1.Length)
: str.Substring(m1.Index, m2.Index - m1.Index + m2.Length);
})
.ToArray();
}