2012-07-07 231 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}是在最后一个例子一个错字。