修剪数学表达式

Trimming a mathematical expression

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

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

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

有没有办法得到{"2", "+", "4", "*", "50"}形式的字符串数组?

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

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

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

全部放在一起:

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

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

您可以尝试按单词边界拆分

 var st = "2+4*50";

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

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