有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中对数学表达式使用正则表达式?

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

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

我需要这个来接受任何表达式,比如:(2+2*7)-4+2/(5-3)+2
我想避免这样的表达:(2+3)- or 2+2-(2+3

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


共 (1) 个答案

  1. # 1 楼答案

    在最一般的形式中,regular expressions可以描述regular languages。另一方面,数学公式通常形式化为context-free languages,这是正则语言的超集。Chomsky hierarchy清楚地表明了这一区别:常规语言是类型3,而上下文无关的语言是更一般的类型2

    直观地说,这里的关键区别在于常规语言无法计数,因此它们无法平衡左括号和右括号。使用有限状态自动机可以检测到一种常规语言,但仅使用有限数量的状态,您不可能跟踪到目前为止看到的开括号的数量,因为可能有任意数量的开括号

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