2017-10-04 41 views
0

我需要所以从这样的文字与数目不详的内部块得到来自外部的对括号 的文本中的文本:获取对外界括号

块1 {{文本1} {文本2 } ... {文字N}}

得到的结果:

{}的text1

{}文本2 ... {文字N}

有没有一种简单的方法怎么办呢?谢谢!

+2

到目前为止您尝试了什么,以及您卡在哪里? – smarx

+0

我发现了很多主题,他们使用正则表达式从括号中获取文本。但我想知道是否有类似的方式来做到这一点,但结果我在这里描述。 –

+0

那么为什么你不分享你迄今为止写的代码呢? – smarx

回答

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

+0

这几乎是,但它只适用于这个例子,如果我有三个像这样的内部块的字符串: Block1 {{text1} {text2} {text3}} 然后它不起作用.. :( –

+0

你介意编辑你的问题是否更具体?它应该适用于任何数量的内部块还是仅仅两个或三个? –

+0

在任何数量的块上......这是问题 –

-3

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

Block1[0] 
+0

最初的问题是关于解析字符串文字的问题。 –