在一对外括号内获取文本

时间:2017-10-04 17:08:48

标签: c# string

我需要从外部括号中获取文本 所以从像这样的文本内部块数量未知:

  

Block1 {{text1} {text2} ... {text n}}

得到结果:

  

{的text1}

  

{text2} .... {text n}

有一种简单的方法可以做到吗?谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式。

    String pattern = @"(Block[0-9]+){({[^}]+})*}";
    String text = @"Block1{{text1}{text2}{text3}{text4}{text5}{text6}}Block2{{text1}{text2}{text3}}";
    foreach(Match match in Regex.Matches(text, pattern))
    {
        Console.Out.WriteLine("---------");
        Console.Out.WriteLine("Match: `" + match.ToString() + "`");

        foreach(Group grp in match.Groups) 
        {
            Console.Out.WriteLine("    Group: `" + grp.Value + "`");
            foreach(Capture cpt in grp.Captures)
            {
                Console.Out.WriteLine("        Capture: `" + cpt.Value + "`");
            }
        }
    }

分解正则表达式模式:

捕获文字Block和零个或多个数字:

(Block[0-9]+)

处理文字{

{

捕获文字{,一个或多个除}以外的任何内容的零次或多次重复,然后是文字}

({[^}]+})*

处理文字}

}

这是.NET fiddle.

编辑2 :根据评论中的对话,原始问题旨在扩大范围。我认为以下答案适用于最初提出的具体案例,但上面的答案是通用的。

您可以使用正则表达式。

    String pattern = @"{({[^}]+})({[^}]+})}";

    Match match = Regex.Match(text, pattern);
    Console.Out.WriteLine("---------");
    Console.Out.WriteLine("Match: `" + match.ToString() + "`");

    if (match.Groups.Count == 3)
    {
        Console.Out.WriteLine("    Group 1: ``" + match.Groups[1].Value);
        Console.Out.WriteLine("    Group 2: ``" + match.Groups[2].Value);
    }

打破这个表达:

匹配一个开口花括号:

{

从一个开口花括号中创建一个组,一个或多个一个结束大括号的字符,以及一个结束大括号。

({[^}]+})

从一个开口花括号中创建一个组,一个或多个一个结束大括号的字符,以及一个结束大括号。

({[^}]+})

匹配一个结束大括号:

}

编辑:我犯了一个错误,我已经用第一个正则表达式纠正了;它产生了text1而不是{text1},而text2也是如此。

答案 1 :(得分:-3)

尝试 索引 方法 。 (例如:Block1 [0],Block1 [1])

Block1[0]