[英]tokenizing mathematical equation using regex
我正在尝试将方程式字符串拆分为标记。 我已经找到了一个很好的起点'([[A-Za-z] + | [0-9。] + | [&=> <\\ |!] + | \\ S)'。 但是,这对于负数有麻烦:
turns: '5--4=sin(2+3)'
into: ['5','-','-','4','=','sin','(','2','+','3',')']
want: ['5','-','-4','=','sin','(','2','+','3',')']
并且
turns: -3+3
into: ['-','3','+','3']
want: ['-3','+','3']
看起来我的正则表达式可以使用某种东西来检查“-”左侧是否有数字,如果不保留下一个数字的话(请注意“ -3”左侧没有任何内容)。 可以使用正则表达式来完成吗? 还是有更好的工具在.NET中进行拆分?
您没有正确解决问题。 您实际得到的结果是正确的。
-3+3
应该解析为:
operator binary +
|
+-- operator unary -
| |
| +-- 3
|
+-- 3
用这种方式来推理数学表达式会容易得多,您可以避免很多歧义。 让-
始终始终是一个令牌,并将其用作二进制减号或一元否定运算符。
请参阅此处 ,以获取有关我的以这种方式解决问题的相关答案(它使用ANTLR,但词法检查完全按照我的建议去做)。
正则表达式的功能不足以在所有情况下都可以做您想做的事情。 尽管可以使正则表达式将+
或-
识别为整数文字的一部分,例如,通过添加可选的[+-]?
在数字序列的前面,结果正则表达式将选择将'-3+3'
标记为['-3', '+3']
( demo )。
使用词法分析器生成器应该可以解决此问题。 或者,您可以在解析器中使用其操作数处理“捆绑”一元运算符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.