修剪数学表达式

时间:2017-09-11 15:42:26

标签: c# regex trim

我有一个正则表达式:[ - ]?\ d + [ - + ^ / \ d] 和这行代码:

foreach(Match m in Regex.Matches(s, "[-]?\d+[-+*^/\d]*")){
...
}

m.Value =(例如)2 + 4 * 50

有没有办法以{“2”,“+”,“4”,“*”,“50”}的形式获得字符串数组?

2 个答案:

答案 0 :(得分:3)

首先,你的正则表达式错了。你有一个与整个字符串匹配的正则表达式,但你想在字符串边界上拆分字符串,所以你想要识别标记。

其次,不要试图解决-是一元减号还是一个运算符的问题。这是一个解析问题。

第三,您可以使用普通的LINQ运算符将匹配集合转换为字符串数组。

把它们放在一起:

    string s = "10*20+30-40/50";
    var matches = 
      Regex.Matches(s, @"\d+|[-+*/]")
      .Cast<Match>()
      .Select(m => m.Value)
      .ToArray();

这种技术只有在你的词汇语法是规则的时候才有效,而很多都不是。 (甚至一些技术上常规的语言也不方便将其描述为正则表达式。)正如我在评论中指出的那样:写一个词法分析器并不难。考虑只写一个词法分析器而不是使用正则表达式。

答案 1 :(得分:0)

您可以尝试拆分字边界

 var st = "2+4*50";

    var li = Regex.Split(st, @"\b");

    foreach (var i in li)
        Console.WriteLine(i);
    2
    +
    4
    *
    50