使用正则表达式拆分带有变量 C# 的方程式
using regex to split equations with variables C#
我已经为此苦苦挣扎了很长一段时间(不是正则表达式忍者),搜索 Whosebug 并通过试验错误。我想我已经很接近了,但是我仍然需要帮助解决一些小问题。
要求是这样的,包括变量、指数等的给定方程在变量、常量、值等之后被正则表达式模式分割。我目前所拥有的
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-9]*\.?[0-9]+([eE][-+]?[0-9]+)?|[-^+*/()]|\w+
正则表达式匹配:
[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?
- 浮点数
|
- 或者...
[-^+*/()]
- 发布的等式中存在的任何算术和逻辑运算符
|
- 或者...
\w+
- 1 个或多个单词字符(字母、数字或下划线)。
对于更复杂的标记化,请考虑使用 NCalc suggested by Lucas Trzesniewski's 。
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+)*
。
所以我想我找到了解决方案,感谢@stribizhev 解决方案引导我找到正则表达式解决方案
Regex re = new Regex(@"(\d+(,\d+)*(?:.\d+)?(?:[eE][-+]?[0-9]+)?|[-^+/()]|\w+)");
tokenList = re.Split(InfixExpression).Select(t => t.Trim()).Where(t => t != "").ToList();
split 给我所需的数组。
我已经为此苦苦挣扎了很长一段时间(不是正则表达式忍者),搜索 Whosebug 并通过试验错误。我想我已经很接近了,但是我仍然需要帮助解决一些小问题。
要求是这样的,包括变量、指数等的给定方程在变量、常量、值等之后被正则表达式模式分割。我目前所拥有的
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-9]*\.?[0-9]+([eE][-+]?[0-9]+)?|[-^+*/()]|\w+
正则表达式匹配:
[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?
- 浮点数|
- 或者...[-^+*/()]
- 发布的等式中存在的任何算术和逻辑运算符|
- 或者...\w+
- 1 个或多个单词字符(字母、数字或下划线)。
对于更复杂的标记化,请考虑使用 NCalc suggested by Lucas Trzesniewski's
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+)*
。
所以我想我找到了解决方案,感谢@stribizhev 解决方案引导我找到正则表达式解决方案
Regex re = new Regex(@"(\d+(,\d+)*(?:.\d+)?(?:[eE][-+]?[0-9]+)?|[-^+/()]|\w+)");
tokenList = re.Split(InfixExpression).Select(t => t.Trim()).Where(t => t != "").ToList();
split 给我所需的数组。