Как я могу извлечь и разделить эти значения? - PullRequest
0 голосов
/ 04 ноября 2011

Вот пример строки, с которой я работаю

{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;
        }
    }

Ответы [ 2 ]

1 голос
/ 04 ноября 2011

Поскольку вы имеете дело с многоуровневым синтаксисом, я думаю, что вы, возможно, захотите создать простой синтаксический анализатор с использованием инструмента генерации синтаксического анализатора, например, «ANTLR». ANTLR Link

синтаксис ANTLR должен выглядеть примерно так:

statements: statement+
     ;
statement: '{'+ content + '}'
     ;
content: token
     | TOKEN + '|' + content
     | TOKEN + '|' + statement
     ;

TOKEN: \w+
     ;
0 голосов
/ 04 ноября 2011

Может быть проще разобрать строку вручную или с помощью некоторого генератора синтаксического анализатора.

Чтобы регулярные выражения соответствовали сбалансированным скобкам, проверьте этот ответ - Регулярное выражение для утилиты, подобной String.Format и связанной статье MSDN http://msdn.microsoft.com/en-us/library/bs2twtah.aspx#balancing_group_definition.

...