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

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

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

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

有什么建议么?

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

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

说明

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

  • -?\d+(?:\.\d+(?:E\d+)?)? 匹配一个号码
  • (
    • \s*可选的空格
    • [-+/\*]任何运算符: +-*/
    • \s+至少一个空格(以避免–b)
    • -?\d+(?:\.\d+(?:E\d+)?)? 匹配另一个号码
  • )+重复此块一次或多次

数字表达式:

  • -? 可选-
  • \d+数字(一个或多个)
  • (?:可选部分的开头
    • \.
    • \d+数字
    • (?:可选科学记数部分的开头
      • E匹配E char
      • \d+匹配digitx
    • )? 关闭可选的科学notatotion部分
  • )? 关闭可选组

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

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

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

参见Dijkstra的Shunting-yard算法 。 这将允许您validation和评估表达式,因此,如果您正在使用此项目, 那么您将不得不实施它

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

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

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