2012-07-07 234 views
3

檢索的文本我有一個字符串具有像正則表達式從字符串

{ctrl1} + {ctrl2} 
({ctrl1}/{ctrl2}) * {ctrl3} 
if ({ctrl1} > {ctrl2}) then {ctrl1} * 10 else {ctrl} + {ctrl2} endif 

值可能有幾個公式是這樣的。這將在一個字符串變量中可用。我需要提取所有的{..}值。

所以,在example1中,我應該提取{ctrl1}, {ctrl2}。在例2中,我應該提取{ctrl1},{ctrl2},{ctrl3}。在example3中,我應該提取{ctrl1}{ctrl2}

有人可以幫我一個正則表達式嗎?

+1

最後一個例子中的{ctrl}怎麼樣? – cha0site 2012-07-07 13:32:17

回答

1

{\S+?}應該做的伎倆。

+2

不確定C#的正則表達式實現,但可能會抓住'{ctrl1} + {ctrl2}'。可能應該使用非貪婪匹配或使用'{[^}] +}' – cha0site 2012-07-07 13:34:28

+1

@ cha0site你是對的,它會匹配'{ctrl1} + {ctrl2}'。我沒有看到降低投票的原因,但它仍然提供了一個解決方案給出的示例數據提出的問題。** – James 2012-07-07 13:37:08

+0

對不起,我不是down-voter。你真的應該添加'?'來進行非貪婪匹配,這會讓你的回答更好。 – cha0site 2012-07-07 13:43:02

2

您可能想要類似{[^}]+}

但請注意,將不會處理像{hello{2}}遞歸的東西。你可能需要一個真正的解析器來解決這個問題。

-2
private void TrimControlNames() 
    { 
     if (txtFormula.Text.Trim().Length > 0) 
     { 
      string formula = txtFormula.Text.Trim(); 

      string pattern1 = "{[a-zA-Z0-9$_ ]+}"; //to identify control placeholders 
      StringBuilder names = new StringBuilder(); 
      foreach (Match m in Regex.Matches(formula, pattern1)) 
      { 
       if (m.Value.Contains(" ")) 
       { 
        string str = m.Value.Replace(" ", string.Empty); //It is ok to remove like this since control names are not allowed to have spaces. 
        formula = formula.Replace(m.Value, str); 
       } 

      } 

      txtFormula.Text = formula; 
     } 

    } 

此方法執行我所期望的操作。

+1

您的方法不起作用。你爲什麼不使用你得到的答案之一? – Schaliasos 2012-07-07 13:59:50

0

您可以結合正則表達式和LINQ,並做到這一點:

Regex.Matches(input, "{.*?}").Cast<Match>().Select(m => m.Value).Distinct(); 

假設{ctrl}是在最後一個例子一個錯字。