【问题标题】:Regex for dividing mathematical function用于划分数学函数的正则表达式
【发布时间】:2020-11-27 14:07:39
【问题描述】:

我正在编写一个导数计算器,我需要将一个给定的字符串输出划分为一个字符串数组,但是我当前的分割命令不能很好地处理负数,我需要它不要在 * 之后分割减号,/,^,(,sin(,cos(,tan( (我仍然没有在我的代码中实现 sin、cos 和 tan,但我会的,所以我想知道如何在它之后不拆分减号)。

代码:

public class Graph {
    private String function;
    private final String ONLY_POSITIVE_DELIMITER = "(?<=[+-/*^()])|(?=[+-/*^()])";
    public Graph(String function) {
        this.function = function;
    }

    public String getDerivative() {
        return null;
    }
    private List<String> getArguments() {
        String[] split = function.split(ONLY_POSITIVE_DELIMITER);

        List<String> args = new ArrayList<>(Arrays.asList(split));
        System.out.println("Splitten der Funktion: "+args);
        return args;

    } 
 }

这会将 1 - ( -2 * -1 ) -3 变成 [1, -, (, -, 2, *, -, 1, ), -, 3],但我希望它变成:[1, -, (, -2, *, -1, ), -, 3]

【问题讨论】:

  • 不,这是一个非常糟糕的主意,因为没有人会输入这样的数学表达式。
  • 我做了,因为我以为你指的是表达不够清楚。

标签: java regex math calculator


【解决方案1】:

使用您现有的模式,您可以取出第一个字符类的-,并添加一个额外的替代方法来断言左侧的-,而不是直接跟随*,/,^,(,sin(,cos(,tan( 之一

(?<=[+/*^()])|(?=[+/*^()-])|(?<=-(?<!(?:[*/^(]|(?:sin|cos|tan)\()-))

Regex demo | Java demo

String ONLY_POSITIVE_DELIMITER = "(?<=[+/*^()])|(?=[+/*^()-])|(?<=-(?<!(?:[*/^(]|(?:sin|cos|tan)\\()-))";
String function = "1-(-2*-1)-3";
String[] split = function.split(ONLY_POSITIVE_DELIMITER);

List<String> args = new ArrayList<>(Arrays.asList(split));
System.out.println("Splitten der Funktion: "+args);

输出

Splitten der Funktion: [1, -, (, -2, *, -1, ), -, 3]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2015-08-11
    相关资源
    最近更新 更多