如何提取和拆分这些值?

时间:2011-11-04 05:36:12

标签: c# regex spintax

以下是我正在使用

的字符串示例
{Hi|Hello|Holla} {James{ey|o|ing}|Bob{bie|bey}}

我需要一个正则表达式来提取{}的例子之间的值:

Hi|Hello|Holla
James{ey|o|ing}
Bob{bie|bey}

原始字符串称为Spintax。我的程序将选择每个{}块中包含的随机值。嵌套的{}块可以非常深入。

正则表达式需要在{}忽略任何嵌套{}块之间提取值。然后,再次通过管道(|)拆分值,忽略任何嵌套的{}块,以便不触及嵌套{}块中的管道。

这有意义吗?

我确实使用String方法实现了部分解决方案,但是当通过管道拆分时,它也会在嵌套的{}中拆分管道,这是可以预料到的,但我无法找到一种方法来忽略嵌套{} < / p>

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 个答案:

答案 0 :(得分:1)

由于您正在处理多嵌套语法,我认为您可能希望使用Parser Generation Tool创建一个简单的解析器,例如“ANTLR”。 ANTLR Link

ANTLR语法应该是这样的:

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

TOKEN: \w+
     ;

答案 1 :(得分:0)

用手或某些解析器生成器解析字符串可能更容易。

对于匹配平衡括号的正则表达式,请查看此答案 - Regular expression for String.Format-like utility以及相关的MSDN文章http://msdn.microsoft.com/en-us/library/bs2twtah.aspx#balancing_group_definition