仅从方程式中提取系数

时间:2019-07-10 14:51:46

标签: c# regex

我有一个等式写成:

第一个公式:(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,因为它是第二系数。)

1 个答案:

答案 0 :(得分:0)

所需的输出,尤其是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);
        }
    }
}

this demo的右上角对表达式进行了说明,如果您想探索/简化/修改它,在this link中,您可以观察它如何与某些示例输入步骤匹配一步一步,如果您喜欢。