Вот пример строки, с которой я работаю
{Hi|Hello|Holla} {James{ey|o|ing}|Bob{bie|bey}}
Мне нужно регулярное выражение для извлечения значений между примером {}:
Hi|Hello|Holla
James{ey|o|ing}
Bob{bie|bey}
Исходная строка называется Spintax. Моя программа выберет случайное значение, заключенное в каждый блок {}. Вложенные блоки {} могут быть достаточно глубокими.
Регулярное выражение должно извлекать значение между {}, игнорируя любые вложенные блоки {}. А затем снова разделите значение по каналу (|), игнорируя все вложенные блоки {}, чтобы каналы внутри вложенных блоков {} не затрагивались.
Имеет ли это смысл?
Я реализовал частичное решение, используя методы String, но при разбиении по каналам он также разделяет каналы внутри вложенного {}, что и следовало ожидать, но я не могу найти способ игнорировать вложенный {}
public String spintaxParse(String s)
{
// TODO: Implement logic to check for {} within String.
if (s.Contains('{'))
{
int firstOccuranceOfOpenBrace = s.IndexOf('{');
while (s[firstOccuranceOfOpenBrace + 1].Equals('{'))
firstOccuranceOfOpenBrace++;
int firstOccuranceOfClosingBrace = s.Substring(firstOccuranceOfOpenBrace).IndexOf('}');
String spintaxBlock = s.Substring(firstOccuranceOfOpenBrace, firstOccuranceOfClosingBrace + 1);
String[] items = spintaxBlock.Substring(1, spintaxBlock.Length - 2).Split('|');
Random rand = new Random();
s = s.Replace(spintaxBlock, items[rand.Next(items.Length)]);
return spintaxParse(s);
}
else
{
return s;
}
}