【问题标题】:How to design and split tokens from the string tokenizer function?如何从字符串标记器函数设计和拆分标记?
【发布时间】:2019-06-30 04:53:36
【问题描述】:

我正在构建一个计算器,可以将公式作为我的一个项目来解决,在该项目中我遇到了一个问题,即 2x+7 之类的字符串将被标记为“2x”、“+”、“7”。

我需要将其正确拆分为常量和变量,这意味着 2x 应该是 "2" 、 "x" 。我如何做到这一点而不影响甚至包括 Sin 和 Cos 函数等的复杂公式?

例如,我希望将 16x + cos(y) 标记为 "16" 、 "x" 、 "+" 、 "cos" 、 "(" 、 "y" 、 ")"

【问题讨论】:

  • 首先解析诸如 sin/cos 之类的函数,当您完成它们时,您将只有 x 之类的变量

标签: java regex math equation stringtokenizer


【解决方案1】:

这个问题会很复杂,这个答案只是一个例子。

也许,我们想弄清楚我们可能有哪些类型的方程,然后我们会开始设计一些表达式。例如,我们可以看看这个:

([a-z]+)|([-]?\d+)|[-+*\/]

Demo 1

或者:

([a-z]+)|([-]?\d+)|([-+*\/])|(\(|\))

Demo 2

示例

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "([a-z]+)|([-]?\\d+)|([-+*\\/])";
final String string = "2x+7\n"
     + "2sin(2x + 2y) = 2sin(x)*cos(2y) + 2cos 2x * 2sin 2y\n"
     + "2sin(2x - 2y) = -2tan 2x / cot -2y + -2cos -2x / 2sin 2y\n";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

正则表达式电路

jex.im 可视化正则表达式:

对于如何最好地为这个问题设计一个解决方案,我真的没有任何建议。但是,也许您想先对方程进行分类,然后设计一些类/方法来处理每个感兴趣的类别,并且在需要正则表达式的情况下,您可能会为您希望完成的所需目的设计一个/多个表达式。

【讨论】:

  • 我看到你已经从正则表达式中将公式作为一个整体进行了分组,但是如果我们只对字符串标记器方法不方便留下的字符串执行它会更容易,例如 19x5ycos, 20xysin i希望将它们作为 19, x, 5, y, cos 和 20, x , y, sin 输入到向量中,因为我已经使用 3 组来相应地保存常量、变量和函数
  • 我只是陈述我的想法,我不知道如何实现它
猜你喜欢
  • 2021-12-08
  • 1970-01-01
  • 2010-10-14
  • 2013-08-21
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
相关资源
最近更新 更多