简单算术字符串的正则表达式
我正在尝试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
- E匹配
-
)?
关闭可选的科学notatotion部分
-
-
)?
关闭可选组
但我强烈建议尝试为此编写一个合适的解析器,它也将允许支持括号: a + (b + c)
。
我讨厌成为“那个人”,但为什么不写一个简单的validation器来解析字符串而不使用正则表达式呢? 使用正则表达式背后的原因是什么? 如果您要编写自己的解析器,不仅解决方案更容易理解和维护,而且只需要更多的工作,您也可以评估表达式。
最好只写一个解析器。 我知道,这听起来很可怕,但这实际上是大学二年级的家庭作业。
参见Dijkstra的Shunting-yard算法 。 这将允许您validation和评估表达式,因此,如果您正在使用此项目, 那么您将不得不实施它 …
我根据Apache License 2.0的条款发布了基于Dijkstra的Shunting Yard算法的表达式评估器:
为什么不使用string.split来获取每个操作数和值。 然后你可以使用更简单的正则表达式([\d*.\d*|\d|+|-|*|/])
或只需要Integer.getInterger
来解析它。