0

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

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

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

其中 ([-+]?\d+(\.\d+)?) 应该匹配任何数字并且

(\[.+\])

应该匹配括号内的东西,但它不工作......由于某种原因它匹配']'和''之类的东西。

任何帮助都会很棒:)

不幸的是,这是练习的一部分,所以我只能使用基本的 java 库……这也是正则表达式的练习。我在这里缺少一些基本的东西吗?

4

4 回答 4

3

您找不到与正则表达式匹配的括号。这是正则语言(正则表达式表示的数学对象)的抽引引理不适用于具有匹配的开/关括号的语言的结果。

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

于 2011-03-29T16:36:37.367 回答
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 规范定义的表达式语言。

于 2011-03-29T16:37:33.093 回答
0

我会回应其他回答者所说的(正则表达式不足以解析算术表达式),但建议在 ANTLR 上煮熟。

他们甚至有一套你可以开始使用的计算器示例。

于 2011-03-30T13:01:36.753 回答
0

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

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

于 2011-07-23T17:40:31.800 回答