2017-10-04 50 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

最初的問題是關於解析字符串文字的問題。 –