我正在尝试验证一个简单的算术表达式,以确保它符合格式操作数运算符操作数:234.34 + 5.我想出了如何足够简单地验证这一点,但我希望用户能够继续输入更多超过2个值,如:234.34 + 5/6 * 7 - -34。到目前为止,我的正则表达式如下:
[-]*\d+[.\d+[E\d+]*]*[\s+[*+/-]\s+[-]*\d+[.\d+[E\d+]*]*]*
这部分有效,但我遇到的问题是它允许我不想要的一些奇怪的东西,如-4.34.1 - 34 +
有什么建议吗?
答案 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
char \d+
匹配digitx )?
关闭可选的科学认证部分)?
关闭可选群组但我强烈建议尝试为此编写一个合适的解析器,它还允许支持括号:a + (b + c)
。
答案 1 :(得分:4)
我讨厌成为“那个人”,但为什么不写一个简单的验证器来解析字符串而不使用正则表达式?使用正则表达式背后的原因是什么?如果您要编写自己的解析器,不仅解决方案更容易理解和维护,而且只需要更多的工作,您也可以评估表达式。
答案 2 :(得分:1)
最好只写一个解析器。我知道,这听起来很可怕,但这实际上是大学二年级的家庭作业。
见Dijkstra的Shunting-yard algorithm。这将允许您验证和评估表达式,因此,如果您正在使用此项目,您将不得不实施它 ...
答案 3 :(得分:1)
我根据Dijkstra's Shunting Yard的条款发布了基于Apache License 2.0算法的表达式评估程序:
答案 4 :(得分:0)
为什么不使用string.split来获取每个操作数和值。然后,您可以使用更简单的正则表达式([\d*.\d*|\d|+|-|*|/])
或仅Integer.getInterger
为您的值解析它。