Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何仅替换匹配集合中的特定匹配?_C#_Regex_String - Fatal编程技术网

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

C# 如何仅替换匹配集合中的特定匹配?,c#,regex,string,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

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

这个过程应该是这样的

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
}
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));

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


公共静态字符串替换(此匹配、字符串源、字符串替换)
{
返回source.Substring(0,match.Index)+replacement+source.Substring(match.Index+match.Length);

}

我认为您的代码在C#中不起作用。您是否从PHP/Perl复制了代码,并希望它能在C#中工作?C不支持调用例程语法
(?R)
。它只支持平衡组。为什么不使用平衡组呢?正则表达式的方法会很痛苦。很好,我不知道关于
DataTable.Compute
。现在,如果在这个类中发现
数据表.MakeCoffee
,我不会感到惊讶。:-)由于这与我给出的表达式一致,我将添加其他函数,如平方根、倒数、模和其他我不确定是否适用的函数。@Benjamin好吧,主要问题是如何查找
(…)
,并用计算结果替换它。使用DataTable计算结果只是一个示例。如果需要更强大的计算引擎,可以使用NCalc-Worth添加到该引擎中,如果要替换选定数量的匹配项,可以使用此函数,但需要添加索引修饰符,该修饰符将根据字符串长度的变化进行更改。然后使用“将索引修改器添加到匹配索引”(从0开始修改器)。