在java中,我正在尝试编写一个与数学表达式中的单位匹配的正则表达式,即运算符之间的东西
我的意思是,在1 + [1 + 2]这样的表达式中,正则表达式应匹配第一个1,然后匹配[1 + 2]。
我所拥有的是* [([ - +]?\ d +(\。\ d +)?)(\ [。+ \])] *
其中([ - +]?\ d +(\。\ d +)?)应匹配任何数字
(\ [+ \])
应该匹配括号内的东西,但是它不起作用...它出于某种原因匹配'''和''之类的东西。
任何帮助都会很棒:)
不幸的是,这是练习的一部分,所以我只能使用基本的java库......它也意味着要用正则表达式练习。我错过了一些基本的东西吗?
答案 0 :(得分:2)
您无法找到具有正则表达式的匹配括号。这是pumping lemma for regular languages(正则表达式所代表的数学对象)不支持具有匹配的打开/关闭parens的语言的结果。
至少你需要一个无上下文的解析器。这些可以使用ANTLR或JavaCC构建。
答案 1 :(得分:1)
您无法使用正则表达式完成此操作。可以使用BNF语法描述算术表达式,该语法可用于使用JavaCC或ANTLR等工具生成解析器。
这是我使用JavaCC实现的表达式解析器:
来源是EPL。如果您查看该CVS位置,您还可以找到AST类和评估逻辑。该实现源自为JSP / JSF规范定义的表达式语言。
答案 2 :(得分:0)
我会回应其他回答者所说的内容(正则表达式不足以解析算术表达式),但推荐parboiled优于ANTLR。
他们甚至可以从a set of calculator examples开始。
答案 3 :(得分:0)
我根据Dijkstra's Shunting Yard的条款发布了基于Apache License 2.0算法的表达式评估程序: