带括号的数学运算的正则表达式
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
【讨论】:
以上是关于带括号的数学运算的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章