C# 将excel函数名/替换excel函数名与另一个函数名匹配的正则表达式

C# 将excel函数名/替换excel函数名与另一个函数名匹配的正则表达式,c#,regex,C#,Regex,我面临以下问题。。。。 例如,我有一个字符串: string formula1 = "=SUMME(A1:A6)" string formula2 = "=RUNDEN(SUMME(A6);1)" string formula3 = "=AUFRUNDEN(ABS(RUNDEN(SUMME(A1:A6);2));2)" string formula4 = "=AUFRUNDEN(RUNDEN(ABS(RUNDEN(SUMME(

我面临以下问题。。。。 例如,我有一个字符串:

string formula1 = "=SUMME(A1:A6)"
string formula2 = "=RUNDEN(SUMME(A6);1)"
string formula3 = "=AUFRUNDEN(ABS(RUNDEN(SUMME(A1:A6);2));2)"
string formula4 = "=AUFRUNDEN(RUNDEN(ABS(RUNDEN(SUMME(A1:A6);2));2);2)"
这些是德语版的Excel公式 但是我真的需要用英语把函数名替换成函数名

我考虑过创建一个字典,由德语函数名(键)和英语函数名(值)组成

通过regex查找德语函数名是否合适,以便稍后用英语术语替换它们

不幸的是,我的正则表达式知识不是很好,我很难创建一个与此模式匹配的正则表达式。或者你会以不同的方式解决它

希望到目前为止这是可以理解的。谢谢你的帮助,你可以试试

(?<name>[A-Za-z][A-Za-z0-9]*)\s*\(
演示:

private static Dictionary<string, string> subs = 
  new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) {
    //TODO: add {Deutsch, English}, pairs here
    { "RUNDEN",    "ROUND" },
    { "ABS",       "ABS" },
    { "SUMME",     "SUM" },
    { "AUFRUNDEN", "ROUNDUP"},
};

private static string ConvertExcel(string formula) {
  return Regex.Replace(
     formula,
    @"(?<name>[A-Za-z][A-Za-z0-9]*)\s*\(",
     m => subs.TryGetValue(m.Groups["name"].Value, out var newValue)
       ? newValue + "("
       : m.Value); // do nothing, if translation is not found
}
string[] tests = new string[] {
  "=SUMME(A1:A6)",
  "=RUNDEN(SUMME(A6);1)",
  "=AUFRUNDEN(ABS(RUNDEN(SUMME(A1:A6);2));2)",
  "=AUFRUNDEN(RUNDEN(ABS(RUNDEN(SUMME(A1:A6);2));2);2)",
};

var result = string.Join(Environment.NewLine, tests
  .Select(test => $"{test,-52} <=> {ConvertExcel(test)}"));

Console.Write(result);
=SUMME(A1:A6)                                        <=> =SUM(A1:A6)
=RUNDEN(SUMME(A6);1)                                 <=> =ROUND(SUM(A6);1)
=AUFRUNDEN(ABS(RUNDEN(SUMME(A1:A6);2));2)            <=> =ROUNDUP(ABS(ROUND(SUM(A1:A6);2));2)
=AUFRUNDEN(RUNDEN(ABS(RUNDEN(SUMME(A1:A6);2));2);2)  <=> =ROUNDUP(ROUND(ABS(ROUND(SUM(A1:A6);2));2);2) 
string[]测试=新字符串[]{
“=总和(A1:A6)”,
“=RUNDEN(总和(A6);1)”,
“=AUFRUNDEN(ABS(RUNDEN(SUMME(A1:A6);2));2)”,
“=AUFRUNDEN(RUNDEN(ABS)(RUNDEN(SUMME(A1:A6);2));2)”,
};
var result=string.Join(Environment.NewLine,tests
.Select(test=>$”{test,-52}{ConvertExcel(test)}”);
控制台。写入(结果);
结果:

private static Dictionary<string, string> subs = 
  new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) {
    //TODO: add {Deutsch, English}, pairs here
    { "RUNDEN",    "ROUND" },
    { "ABS",       "ABS" },
    { "SUMME",     "SUM" },
    { "AUFRUNDEN", "ROUNDUP"},
};

private static string ConvertExcel(string formula) {
  return Regex.Replace(
     formula,
    @"(?<name>[A-Za-z][A-Za-z0-9]*)\s*\(",
     m => subs.TryGetValue(m.Groups["name"].Value, out var newValue)
       ? newValue + "("
       : m.Value); // do nothing, if translation is not found
}
string[] tests = new string[] {
  "=SUMME(A1:A6)",
  "=RUNDEN(SUMME(A6);1)",
  "=AUFRUNDEN(ABS(RUNDEN(SUMME(A1:A6);2));2)",
  "=AUFRUNDEN(RUNDEN(ABS(RUNDEN(SUMME(A1:A6);2));2);2)",
};

var result = string.Join(Environment.NewLine, tests
  .Select(test => $"{test,-52} <=> {ConvertExcel(test)}"));

Console.Write(result);
=SUMME(A1:A6)                                        <=> =SUM(A1:A6)
=RUNDEN(SUMME(A6);1)                                 <=> =ROUND(SUM(A6);1)
=AUFRUNDEN(ABS(RUNDEN(SUMME(A1:A6);2));2)            <=> =ROUNDUP(ABS(ROUND(SUM(A1:A6);2));2)
=AUFRUNDEN(RUNDEN(ABS(RUNDEN(SUMME(A1:A6);2));2);2)  <=> =ROUNDUP(ROUND(ABS(ROUND(SUM(A1:A6);2));2);2) 
=总和(A1:A6)=总和(A1:A6)
=朗登(总和(A6);1)=四舍五入(总和(A6);1)
=AUFRUNDEN(ABS(RUNDEN(SUMME(A1:A6);2));2)=汇总(ABS(ROUND)(SUMME(A1:A6);2));2)
=AUFRUNDEN(RUNDEN(ABS)(RUNDEN)(SUMME(A1:A6);2));2=ROUND(ABS)(ROUND)(SUM(A1:A6);2));2)