java - 在java中使用正则表达式进行数学表达式?

标签 java regex math expression

我正在研究这个正则表达式

((([(]?[-]?[0-9]*[.]?[0-9]+)+([\/\+\-\*])+)+([0-9]*[.]?[0-9]+[)]?)+[\+\-\*\/]?([0-9]*)*)+

我需要它接受任何表达式,例如:(2+2*7)-4+2/(5-3)+2
我想避免使用以下表达式:(2+3)- 或 2+2-(2+3

目标是从用户那里获取表达式并将其分解为标记,但在此之前我想检查输入的有效性。

最佳答案

最一般的形式是 regular expressions可以描述regular languages 。另一方面,数学公式通常形式化为 context-free languages ,它们是常规语言的超集。 Chomsky hierarchy明确这种区别:常规语言属于类型 3,而上下文无关语言属于更一般的类型 2。

直观上,这里的关键区别是常规语言无法计数,因此它们无法平衡左括号和右括号。可以使用有限状态自动机来检测常规语言,但是仅使用有限数量的状态,您不可能跟踪到目前为止已经看到了多少个左括号,因为它们可能是任意数量的。

您可能想研究 lexer 之间的区别和一个parser 。通常,您会使用前者和正则表达式将流标记为数字、运算符等,而您会使用后者来构建和检查由这些标记组成的表达式。

关于java - 在java中使用正则表达式进行数学表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24394204/

相关文章:

java - 无论索引如何,最后一行始终从 DefaultTableModel 中删除

java - Spring Boot/JUnit - 没有 'boolean' 类型的合格 bean 可用

java - 将 +n 添加到某些 id 以 "v + number"结尾的字符串的名称中

java - Java 日期验证的正则表达式

algorithm - 用功能语言了解此多项式除法算法

java - 如何在 java 8 中模拟 YearMonth

java - 正则表达式 + Java : split a text into words and removing punctuation only if they are alone or at the end

regex - 从 R 中的字符串中提取日期

math - 定点的逆平方

math - CSS3 算术