我一直在努力解决这个问题(不是一个正则表达式的忍者),搜索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+)|([\,\+\-\*\(\)\^\/\ ])");
哪都有缺陷。任何帮助将不胜感激。
答案 0 :(得分:4)
对于类似原始问题中发布的方程式,您可以使用
[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?|[-^+*/()]|\w+
请参阅regex demo
正则表达式匹配:
[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?
- 一个浮点数|
- 或...... [-^+*/()]
- 公式中出现的任何算术和逻辑运算符|
- 或...... \w+
- 一个或多个单词字符(字母,数字或下划线)。对于更复杂的标记化,请考虑使用NCalc的Lucas Trzesniewski建议的comment。
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();
分割时给我所需的数组。