使用正则表达式来分割变量C#的方程式

时间:2016-01-13 22:28:09

标签: c# regex equations

我一直在努力解决这个问题(不是一个正则表达式的忍者),搜索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+)|([\,\+\-\*\(\)\^\/\ ])");

哪都有缺陷。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

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

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

请参阅regex demo

正则表达式匹配:

  • [0-9]*\.?[0-9]+([eE][-+]?[0-9]+)? - 一个浮点数
  • | - 或......
  • [-^+*/()] - 公式中出现的任何算术和逻辑运算符
  • | - 或......
  • \w+ - 一个或多个单词字符(字母,数字或下划线)。

对于更复杂的标记化,请考虑使用NCalcLucas Trzesniewski建议的comment

C# sample code

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+)*

答案 1 :(得分:-1)

所以我认为我有一个解决方案,感谢@stribizhev解决方案引导我进入正则表达式解决方案

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

分割时给我所需的数组。