使用正则表达式标记数学方程
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,但词法分析过程完全符合我的建议)。
我正在尝试将等式字符串拆分为标记。我找到了一个很好的起点“([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
通过这种方式 可以更容易地推理数学表达式,您将避免 许多 歧义。让 -
始终是它自己的标记,并将其用作二元减号或一元否定运算符。
请参阅