寻找字符串的匹配项(显示计算器)

Looking for a match for a String (display calculator)

我正在 Java 制作一个计算器。问题是我试图找到一个匹配,给定一个字符串,只接受第二个操作数(操作可以是 +-*/) .

示例字符串输入:

21 + 574
573 * 1
89 - 4312
23 / 23
-1 + 4
-3 + 45

对应的字符串输出:

574
1
4312
23
4
45

有人知道 匹配 可以做到这一点吗?

正如我已经在您的 post 的评论部分中提供的那样,以下内容将拆分出您想要的值:

System.out.println("21 + 574".split("\s*(\+|\-|\*|\/)\s*")[1]);

这仅适用于无符号(正)数,因为减号 (-) 也用于负数的符号(例如 -574)。如果您还想处理负值,则需要对正则表达式稍作更改。我们需要在'-'字符后加一个空格,例如:

"\s*(\+|\- |\*|\/)\s*"
             ^
           Space

这意味着,任何包含减法的方程式都必须在减号运算符后包含一个空格。如果等式如下:4 + -6,这很有效。即使数字和运算符之间没有空格,这仍然没问题,例如:4+-6。但是,如果前面方程中的运算符是减号运算符而不是加号运算符,则情况完全不同,例如:4--6。该等式实际上会生成 ArrayIndexOutOfBoundsException。这显然不行。

为了解决这种特殊情况,我们需要将两个减号字符 (--) 分开,为此我们可以使用 String#replace() 方法,例如:

System.out.println("4--6".replace("--", "- -").split("\s*(\+|\- |\*|\/)\s*")[1]);

这将输出:-6.

总有一天(我敢肯定很快)即使这个或任何其他小捷径都不够好,您将需要实际解析方程式。圆括号和大括号在数学方程式中起着重要作用,您将需要一些东西来解析所有这些。对于这种事情,正则表达式可能不够好。

下面我提供了一种快速方法,可以将方程拆分为单独的组件,这些组件可能包含也可能不包含方括号、大括号、负数等。也许这可以用作创建您自己的方程解析器(或查找并利用已经开发的一个)。

/**
 * This method will split a math equation string (even with various bracket 
 * types or nested brackets) into a String[] Array. Signed and unsigned 
 * integer or floating point values can be within the supplied mathematical
 * equation.<br><br>
 * 
 * Whitespaces are ignored during parsing and will not be contained within 
 * the returned String[] Array as an array element.<br>
 * 
 * @param equation (String) The mathematical equation to parse into a 
 * String [] Array.<br>
 * 
 * @return (Single Dimensional String[] Array)
 */
private String[] splitEquation(String equation) {
    List<String> list = new ArrayList<>();
    String number = "";
    for (char c : equation.toCharArray()) {
        if (c == ' ') { 
            if (!number.isEmpty()) {
                list.add(number);
                number = "";
            }
        }
        else if (Character.isDigit(c) || c == '.' || (c == '-' && number.isEmpty())) {
            number += Character.toString(c);
        }
        else if (!Character.isDigit(c) && !number.isEmpty()) {
            list.add(number);
            number = "";
            list.add(Character.toString(c));
        }
        else {
            list.add(Character.toString(c));
        }
    }
    if (!number.isEmpty()) {
        list.add(number);
    }
    return list.toArray(new String[list.size()]);
}

要使用此方法:

String[] parts = splitEquation("(4+(-3/2))");
System.out.println(Arrays.toString(parts));

控制台window将显示:

[(, 4, +, (, -3, /, 2, ), )]