首页 > 解决方案 > 仅从方程中获取系数

问题描述

我有一个公式如下:

第一个公式: (0.085+4.346*10^-5*((a^2)-(0^2))+0.0017228*(a-(0)))*2 系数为:
1) 0.085
2) 4.346*10^5
3) 0.0017228

第二个公式:((0.208+0*d^3-0.00000434*d^2-0.00203*d)*2) 系数是:
1) 0.208
2) 0
3) -0.00000434
4) -0.00203

从上面提到的公式中,我需要一个用 C# 编写的正则表达式来获取上面提到的系数。

我尝试了正则表达式:"[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?" 返回良好的系数 s 但不是上面第二个公式中提到的 '0'。

我尝试了以下代码:

    string p = @"((0.208+0*d^3-0.00000434*d^2-0.00203*d)*2)";

     var result = Regex.Matches(p, @"[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?").Cast<Match>().Select(m => m.Value).Where((x, i) => i % 2 == 0).ToList();
     foreach(string item in result)
     {
        Console.WriteLine(item);
     }

上述代码的结果:0.208
-0.00000434 -0.00203(此处缺少 0 作为所需的第二个系数。)

标签: c#regex

解决方案


所需的输出,具体来说 4.346*10^5,会使这个表达式过于复杂,而且我也不认为 RegEx 足够好,即使你的原始表达式很好。然后我们将其稍微简化为:

-?[0-9]*(?:\.?[0-9]+)?(?:[eE][-+]?[0-9]+)? 

并希望您可能会弄清楚如何输出4.346*10^5或处理/绕过它。


测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"-?[0-9]*(?:\.?[0-9]+)?(?:[eE][-+]?[0-9]+)?";
        string input = @"0.085+4.346*10^-5*((a^2)-(0^2))+0.0017228*(a-(0)))*2
0.208+0*d^3-0.00000434*d^2-0.00203*d)*2)";
        RegexOptions options = RegexOptions.Multiline;
        
        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

该表达式在此演示的右上方面板中进行了说明,如果您希望探索/简化/修改它,并且在此链接中,您可以逐步观看它如何与一些示例输入匹配,如果您愿意的话。


推荐阅读