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

Posted

技术标签:

【中文标题】带括号的数学运算的正则表达式【英文标题】:Regular expression for math operations with parentheses 【发布时间】:2011-07-25 10:50:08 【问题描述】:

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

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

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

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

(\[.+\])

应该匹配括号内的内容,但它不起作用...由于某种原因,它正在匹配诸如 ']' 和 ' ' 之类的内容。

任何帮助都会很棒:)

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

【问题讨论】:

平衡良好的括号不是常规语言。忘记使用正则表达式解析数学表达式。 您实际上不想使用正则表达式来执行此操作。您想使用分词器来拆分您的字符串。 @CanSpice 这是 2011 年,我们使用 .split() 而不是 StringTokenizer :-) 实际上,标记化是常规部分。 OP 似乎需要一个解析器。 除此之外,还可以匹配示例中显示的复杂度的表达式。但我怀疑正则表达式甚至会因为领先的 * 而编译 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

您将无法使用正则表达式完成此操作。算术表达式可以使用 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 规范定义的表达式语言。

【讨论】:

【参考方案3】:

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

他们甚至有 a set of calculator examples 你可以开始使用。

【讨论】:

【参考方案4】:

我发布了一个基于Dijkstra's Shunting Yard算法的表达式评估器,在Apache License 2.0的条款下:

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

【讨论】:

以上是关于带括号的数学运算的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

利用正则表达式来实现求一个数学表达式的和

正则表达式实现计算器

复杂的正则表达式仅识别带括号的参数

带括号的正则表达式测试[重复]

团队-科学计算器-需求分析

《团队-科学计算器-需求分析》