如何仅替换匹配集合中的特定匹配?

时间:2015-07-27 15:55:12

标签: c# regex string

我正在编写一个求解方程的求解方法。该方法将是递归的;搜索所有外括号并在找到时调用求解括号内的值,并在没有找到括号时返回值。

这个过程应该是这样的

20 * (6+3) / ((4+6)*9)
20 * 9 / ((4+6)*9)
20 * 9 / (10*9)
20 * 9 / 90
2

如您所见,每场比赛可能有不同的替换值。我需要将括号替换为它的计算结果。有没有办法做到这一点。这是我到目前为止所拥有的。

public int solve(string etq)
    {

        Regex rgx = new Regex(@"\(([^()]|(?R))*\)");
        MatchCollection matches;

        matches = rgx.Matches(etq);

        foreach(Match m in matches){

            //replace m in etq with unique value here

        }

    //calculations here
    return calculation
    }

Regex.replace(...)替换所有出现的指定模式。我希望能够匹配多个场景并用不同的输出替换每个场景

2 个答案:

答案 0 :(得分:6)

简单的解决方案:

string input = "20 * (6+3) / ((4+6)*9)";
Console.WriteLine(input);
DataTable dt = new DataTable();
Regex rx = new Regex(@"\([^()]*\)");
string expression = input;
while (rx.IsMatch(expression))
{
    expression = rx.Replace(expression, m => dt.Compute(m.Value, null).ToString(), 1);
    Console.WriteLine(expression);
}
Console.WriteLine(dt.Compute(expression, null));

https://dotnetfiddle.net/U6Hh1e

答案 1 :(得分:1)

这将是一个更简单的解决方案,使用匹配属性替换使用子字符串:

public static string Replace(this Match match, string source, string replacement) { return source.Substring(0, match.Index) + replacement + source.Substring(match.Index + match.Length); }