【问题标题】:Java regex matching the mathematical expression patternJava 正则表达式匹配数学表达式模式
【发布时间】:2014-06-03 05:01:15
【问题描述】:

我正在尝试递归或迭代地匹配这样的字符串模式。

term :- 可以是任何变量(字符串)或整数
表达式:- 术语 + 表达式或术语 * 表达式或术语/表达式或术语 - 表达式

我们的想法是为这样的数学表达式找到匹配的模式

ZING^30*sin(45)+46*LENGTH-20

让我们假设这个词已经准备好了。

像往常一样,我将从一个非常糟糕的...在 java 中开始。

[[term\\+]*[term\\*]*[term\\\]*[term\\-]*]+term

【问题讨论】:

  • 看起来你可能有一个可以与递归下降解析器一起使用的语法......虽然不知道你是否可以使用正则表达式
  • 您能否通过示例详细说明输入和预期输出。
  • 您的示例包含一个 sin() 函数,该函数与您对表达式语法的描述不匹配。
  • @EJP 我认为它与“term”的“variable(string)”定义相匹配,假设“variable”表示任何标识符,“string”表示任何字符序列(可能不包括括号)。至少我是这么认为的。要求不明确。

标签: java regex expression


【解决方案1】:

您为这项工作使用了错误的工具。根据定义,正则表达式不能描述具有递归语法的语法。查找乔姆斯基层次结构。你需要一个表达式解析器。查找 Dijkstra Shutting-yard 算法,或“递归下降表达式解析器”。

【讨论】:

    【解决方案2】:

    这看起来像家庭作业,所以我不会给你一个完整的答案。如果您知道如何使用适度复杂的正则表达式,您应该能够想出一个正则表达式来表示您的“术语”——这应该不会太难。现在“表达式”的正则表达式将是一个术语,后跟零次或多次出现的“运算符后跟术语”(运算符是+-*/ 之一,也许是^ ?)。也就是说,表达式将是“term”,或“term op term”,或“term op term op term”等。

    注意:这是您编写正则表达式的方式,它告诉您输入是否具有正确的格式,但它不会帮助您将其分解为多个部分。为此,您需要在循环中匹配的不同正则表达式(或两个)。不过,我无法说出您的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-24
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多