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

本文关键字:集合 何仅 替换 | 更新日期: 2023-09-27 18:04:50

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

这个过程应该是这样的

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(…)替换指定模式的所有出现。我希望能够匹配多个场景,并将每个场景替换为不同的输出

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

简单解决方案:

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

这将是一个更简单的解决方案,使用match属性来替换使用substring:

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