修剪数学表达式
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
我有一个正则表达式:[-]?\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