繁体   English   中英

使用正则表达式标记化数学方程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM