【问题标题】:using regex for math expressions in java?在java中使用正则表达式作为数学表达式?
【发布时间】:2013-10-19 08:29:45
【问题描述】:

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

((([(]?[-]?[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

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

【问题讨论】:

  • 数学符号主要是上下文无关的语法,这(并非不可能,但)使用正则表达式非常难以实现。如果令牌与产品不匹配,为什么不直接抛出错误?
  • 不要为此使用正则表达式。使用Expression Tree
  • 所以基本上你想检查他们是否有正确数量的分隔符()?
  • @Qantas94Heavy 什么?这是不可能的!

标签: java regex math expression


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-02
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多