使用正则表达式拆分带有变量C#的方程

本文关键字:变量 方程 正则表达式 拆分 | 更新日期: 2023-09-27 18:30:09

我已经为此挣扎了很长一段时间(不是regex忍者),搜索stackoverflow并通过尝试出现错误。我想我已经接近了,但还有一些小问题需要帮助解决。

要求是这样的,一个给定的方程,包括变量、指数等,被正则表达式模式分割在变量、常数、值等之后。到目前为止,我有

     Regex re = new Regex(@"(',|'(|')|(-?'d*'.?'d+e[+-]?'d+)|'+|'-|'*|'^)");
     var tokens = re.Split(equation)

所以像这样的方程

    2.75423E-19* (var1-5)^(1.17)* (var2)^(1.86)* (var3)^(3.56)

应解析为

     [2.75423E-19 ,*, (, var1,-,5, ), ^,(,1.17,),*....,3.56,)]

然而,指数部分也被分割了,我认为这是由于正则表达式部分:|+|-。

我尝试过的其他格式是:

    Regex re1 = new Regex(@"([','+'-'*'(')'^'/' ])"); and 
    Regex re = new Regex(@"(-?'d*'.?'d+e[+-]?'d+)|([','+'-'*'(')'^'/' ])");

两者都有缺陷。如有任何帮助,我们将不胜感激。

使用正则表达式拆分带有变量C#的方程

对于原始问题中发布的方程,您可以使用

[0-9]*'.?[0-9]+([eE][-+]?[0-9]+)?|[-^+*/()]|'w+

参见regex演示

正则表达式匹配:

  • [0-9]*'.?[0-9]+([eE][-+]?[0-9]+)?-浮点数
  • |-或
  • [-^+*/()]-发布的公式中存在的任何算术和逻辑运算符
  • |-或
  • 'w+-1个或多个单词字符(字母、数字或下划线)

对于更复杂的标记化,可以考虑使用Lucas Trzesniewski的评论所建议的NCalc。

C#样本代码:

var line = "2.75423E-19* (var1-5)^(1.17)* (var2)^(1.86)* (var3)^(3.56)";
var matches = Regex.Matches(line, @"[0-9]*'.?[0-9]+([eE][-+]?[0-9]+)?|[-^+*/()]|'w+");
foreach (Match m in matches)
    Console.WriteLine(m.Value);

并为您更新了代码,以表明Regex.Split在这里是不必要的:

var result = Regex.Matches(line, @"'d+(?:[,.]'d+)*(?:e[-+]?'d+)?|[-^+*/()]|'w+", RegexOptions.IgnoreCase)
             .Cast<Match>()
             .Select(p => p.Value)
             .ToList();

此外,要匹配格式化的数字,可以使用'd+(?:[,.]'d+)*,而不是[0-9]*'.?[0-9]+'d+(,'d+)*

所以我想我有了一个解决方案,这要归功于@stribizhev解决方案,让我找到regex解决方案

            Regex re = new Regex(@"('d+(,'d+)*(?:.'d+)?(?:[eE][-+]?[0-9]+)?|[-^+/()]|'w+)");
            tokenList = re.Split(InfixExpression).Select(t => t.Trim()).Where(t => t != "").ToList();  

当split给我想要的数组时。