如何从字符串标记器函数设计和分割标记?

时间:2019-06-30 04:53:36

标签: java regex math equation stringtokenizer

我正在构建一个可以解决公式问题的计算器,这是我的一个项目,在该项目中,我遇到了诸如2x + 7这样的字符串将被标记为“ 2x”,“ +”,“ 7”的问题。

我需要适当地将其拆分为常量和变量,这意味着2x应该为“ 2”,“ x”。如何做到这一点而又不会影响包括Sin和Cos函数等在内的复杂公式?

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

1 个答案:

答案 0 :(得分:0)

  

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

也许,我们想弄清楚我们可能拥有什么类型的方程式,然后我们将开始设计一些表达式。例如,我们可以看一下:

([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));
    }
}

RegEx电路

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

enter image description here

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