带括号的数学运算的正则表达式

时间:2011-03-29 16:29:38

标签: java regex math parentheses

在java中,我正在尝试编写一个与数学表达式中的单位匹配的正则表达式,即运算符之间的东西

我的意思是,在1 + [1 + 2]这样的表达式中,正则表达式应匹配第一个1,然后匹配[1 + 2]。

我所拥有的是* [([ - +]?\ d +(\。\ d +)?)(\ [。+ \])] *

其中([ - +]?\ d +(\。\ d +)?)应匹配任何数字

(\ [+ \])

应该匹配括号内的东西,但是它不起作用...它出于某种原因匹配'''和''之类的东西。

任何帮助都会很棒:)

不幸的是,这是练习的一部分,所以我只能使用基本的java库......它也意味着要用正则表达式练习。我错过了一些基本的东西吗?

4 个答案:

答案 0 :(得分:2)

您无法找到具有正则表达式的匹配括号。这是pumping lemma for regular languages(正则表达式所代表的数学对象)不支持具有匹配的打开/关闭parens的语言的结果。

至少你需要一个无上下文的解析器。这些可以使用ANTLR或JavaCC构建。

答案 1 :(得分:1)

您无法使用正则表达式完成此操作。可以使用BNF语法描述算术表达式,该语法可用于使用JavaCC或ANTLR等工具生成解析器。

这是我使用JavaCC实现的表达式解析器:

http://dev.eclipse.org/viewcvs/viewvc.cgi/org.eclipse.sapphire/plugins/org.eclipse.sapphire.modeling/src/org/eclipse/sapphire/modeling/el/parser/internal/ExpressionLanguageParser.jj?view=markup&revision=1.6&root=Technology_Project

来源是EPL。如果您查看该CVS位置,您还可以找到AST类和评估逻辑。该实现源自为JSP / JSF规范定义的表达式语言。

答案 2 :(得分:0)

我会回应其他回答者所说的内容(正则表达式不足以解析算术表达式),但推荐parboiled优于ANTLR。

他们甚至可以从a set of calculator examples开始。

答案 3 :(得分:0)

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

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