正则表达式从字符串中检索文本

时间:2012-07-07 13:20:03

标签: c# regex

我有一个字符串,其值为

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

可能有几个像这样的公式。这将在字符串变量中提供。我需要提取所有{..}值。

因此,在example1中,我应该提取{ctrl1}{ctrl2}。在Example2中,我应该提取{ctrl1}{ctrl2}{ctrl3}。在示例3中,我应该提取{ctrl1}{ctrl2}

有人可以帮我准备一个正则表达式吗?

4 个答案:

答案 0 :(得分:2)

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

但请注意,这不会处理{hello{2}}之类的递归内容。你可能需要一个真正的解析器来做这样的事情。

答案 1 :(得分:1)

{\S+?}之类的东西可以解决问题。

答案 2 :(得分:0)

您可以将regex和LINQ结合起来并执行此操作:

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

假设{ctrl}在上一个例子中是一个拼写错误。

答案 3 :(得分:-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;
        }

    }

此方法执行我的预期。