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开始修改器)。