涉及浮点数的表达式计算器的正则表达式

时间:2018-07-12 18:34:25

标签: java android regex

我正在Android中制作一个表达式计算器,因此我想在实际计算答案之前检查字符串是否符合有效表达式的要求。

我在Java中尝试过此正则表达式:

^ \ s *([-+]?)(\ d +)(?:\ s *([-+ /])\ s ((? -+])?\ d +)\ s *)+ $

但是问题在于,它只能匹配不涉及浮点数的表达式。

有人可以指导我,并为我提供适当的正则表达式吗?

一些应该匹配的示例字符串:

  

3.2 + 4.6-9.001 * 1

     

4 + 2 + 9.0-89

     

590 + 9.077236 + 3673.126 + 34787.3284-0.99347 * 872367

2 个答案:

答案 0 :(得分:1)

我建议不要将其作为正则表达式。老实说,您可以读取和调试该字符串吗?如果您想添加幂运算等功能,是否可以更改它并对此充满信心?当然不是。  使用真实的解析器框架(令牌生成器甚至是SDK的一部分)并通过令牌字符串进行验证。无论如何,您都需要这样做才能有效地评估表达式。

答案 1 :(得分:1)

正则表达式不适合解析数学表达式,这是因为正则表达式是一种与DFA / NFA状态机相对应的语言,在该状态机中,语言不保持其达到特定状态的方式。相反,应该使用上下文无关的语言来解析数学表达式。

在上下文无关的语言中,由于数学表达式具有类似树的递归结构,因此上下文无关的语言允许解析器维护在解析过程中如何进入状态的信息,上下文无关的语言还将允许您表达运算符的优先级并检查匹配的括号(正则表达式不能)。

要创建解析器,您可以以递归的体面解析器的形式手动编写自己(有许多示例说明如何编写一个用于解析表达式的示例),也可以使用工具或框架来生成用于解析器的解析器你。

您仍然可以使用正则表达式来识别数字和运算符,然后将它们输入解析器,这使解析过程更加简单。识别语言的“单词”的阶段称为词法分析,识别语言的结构的阶段称为句法阶段。

这是对解析的非常简短的描述,但希望对您有所帮助。