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

Java 带括号的数学运算的正则表达式,java,regex,math,parentheses,Java,Regex,Math,Parentheses,在java中,我试图编写一个正则表达式来匹配数学表达式中的一个单位,即运算符之间的内容 我的意思是,在像1+[1+2]这样的表达式中,正则表达式应该匹配第一个1,然后匹配[1+2] 我拥有的是*[([-+]?\d+(\.\d+)(\[.+\])]* 其中([-+]?\d+(\.\d+))应该与任何数字匹配,并且 (\[.+\])) 应该匹配括号内的某些内容,但它不起作用…出于某种原因,它正在匹配诸如“]”和“”之类的内容 任何帮助都会很好:) 不幸的是,这是一个练习的一部分,所以我只能使用基本j

在java中,我试图编写一个正则表达式来匹配数学表达式中的一个单位,即运算符之间的内容

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

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

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

(\[.+\]))

应该匹配括号内的某些内容,但它不起作用…出于某种原因,它正在匹配诸如“]”和“”之类的内容

任何帮助都会很好:)


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

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


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

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


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

用正则表达式无法实现这一点。可以使用BNF语法描述算术表达式,BNF语法可用于使用JavaCC或ANTLR等工具生成解析器

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


来源是EPL。如果您环顾该CVS位置,还将发现AST类和求值逻辑。该实现是从为JSP/JSF规范定义的表达式语言派生而来的。

使用正则表达式无法实现这一点。可以使用BNF语法描述算术表达式,BNF语法可用于使用JavaCC或ANTLR等工具生成解析器

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


来源是EPL。如果您环顾该CVS位置,还将发现AST类和求值逻辑。该实现源于为JSP/JSF规范定义的表达式语言。

我将附和其他回答者所说的(regex不足以解析算术表达式),但推荐使用ANTLR


他们甚至有你可以开始的答案。

我会附和其他回答者所说的(regex不足以解析算术表达式),但建议不要使用ANTLR


他们甚至有你可以开始的。我发布了一个基于算法的表达式计算器,条款如下:


我发布了一个基于算法的表达式计算器,条款如下:


平衡良好的括号不是常规语言。忘记用正则表达式解析数学表达式吧。实际上,你不想用正则表达式解析数学表达式。您想使用标记器分割字符串。@CanSpice这是2011年,我们使用
.split()
而不是
StringTokenizer
:-)实际上,标记化是常规的部分。OP似乎需要一个解析器。除此之外,还可以匹配如示例所示的复杂度表达式。但我怀疑正则表达式是否会编译,因为前导的*平衡良好的括号不是一种常规语言。忘记用正则表达式解析数学表达式吧。实际上,你不想用正则表达式解析数学表达式。您想使用标记器分割字符串。@CanSpice这是2011年,我们使用
.split()
而不是
StringTokenizer
:-)实际上,标记化是常规的部分。OP似乎需要一个解析器。除此之外,还可以匹配如示例所示的复杂度表达式。但我怀疑正则表达式是否会编译,因为*