简单算术字符串的正则表达式

时间:2011-02-22 23:59:05

标签: java regex math

我正在尝试验证一个简单的算术表达式,以确保它符合格式操作数运算符操作数:234.34 + 5.我想出了如何足够简单地验证这一点,但我希望用户能够继续输入更多超过2个值,如:234.34 + 5/6 * 7 - -34。到目前为止,我的正则表达式如下:

[-]*\d+[.\d+[E\d+]*]*[\s+[*+/-]\s+[-]*\d+[.\d+[E\d+]*]*]*

这部分有效,但我遇到的问题是它允许我不想要的一些奇怪的东西,如-4.34.1 - 34 +

有什么建议吗?

5 个答案:

答案 0 :(得分:5)

试试这个。它很难看,但它应该有效(如果你没有使用任何括号):

-?\d+(?:\.\d+(?:E\d+)?)?(\s*[-+/\*]\s+-?\d+(?:\.\d+(?:E\d+)?)?)+

解释

这将算一个数字后跟一个运算符和一个数字无限期

  • -?\d+(?:\.\d+(?:E\d+)?)?匹配数字
  • (
    • \s*可选空格
    • [-+/\*]任何运营商:+-*/
    • \s+至少有一个空格(以避免使用--b)
    • -?\d+(?:\.\d+(?:E\d+)?)?匹配另一个号码
  • )+重复此块一次或多次

数字表达式:

  • -?可选-
  • \d+位数(一个或多个)
  • (?:可选部分的开头
    • \. dot
    • \d+位数
    • (?:可选科学记谱法部分的开头
      • E匹配E char
      • \d+匹配digitx
    • )?关闭可选的科学认证部分
  • )?关闭可选群组

但我强烈建议尝试为此编写一个合适的解析器,它还允许支持括号:a + (b + c)

答案 1 :(得分:4)

我讨厌成为“那个人”,但为什么不写一个简单的验证器来解析字符串而不使用正则表达式?使用正则表达式背后的原因是什么?如果您要编写自己的解析器,不仅解决方案更容易理解和维护,而且只需要更多的工作,您也可以评估表达式。

答案 2 :(得分:1)

最好只写一个解析器。我知道,这听起来很可怕,但这实际上是大学二年级的家庭作业。

见Dijkstra的Shunting-yard algorithm。这将允许您验证和评估表达式,因此,如果您正在使用此项目,您将不得不实施它 ...

答案 3 :(得分:1)

我根据Dijkstra's Shunting Yard的条款发布了基于Apache License 2.0算法的表达式评估程序:

http://projects.congrace.de/exp4j/index.html

答案 4 :(得分:0)

为什么不使用string.split来获取每个操作数和值。然后,您可以使用更简单的正则表达式([\d*.\d*|\d|+|-|*|/])或仅Integer.getInterger为您的值解析它。