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

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' 作为 ['-3', '+3'] (demo).

使用词法分析器生成器应该可以解决这个问题;或者,您可以在 parser.

中处理 "bundling" 一元运算符及其操作数

您没有正确处理问题。你实际得到的结果正确的。

-3+3 应该解析为:

operator binary +
|
+-- operator unary -
|   |
|   +-- 3
|
+-- 3

通过这种方式 可以更容易地推理数学表达式,您将避免 许多 歧义。让 - 始终是它自己的标记,并将其用作二元减号或一元否定运算符。

请参阅 以获取我的相关答案,该答案以这种方式解决问题(它使用 ANTLR,但词法分析过程完全符合我的建议)。