首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找字符串的匹配(显示计算器)

查找字符串的匹配(显示计算器)
EN

Stack Overflow用户
提问于 2022-05-19 16:51:22
回答 1查看 55关注 0票数 1

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

示例字符串输入:

代码语言:javascript
复制
21 + 574
573 * 1
89 - 4312
23 / 23
-1 + 4
-3 + 45

相应的字符串输出:

代码语言:javascript
复制
574
1
4312
23
4
45

有人知道有匹配的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-20 01:04:46

由于我已经在您的帖子的注释部分提供了以下内容,下面将拆分您想要的值:

代码语言:javascript
复制
System.out.println("21 + 574".split("\\s*(\\+|\\-|\\*|\\/)\\s*")[1]);

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

代码语言:javascript
复制
"\\s*(\\+|\\- |\\*|\\/)\\s*"
             ^
           Space

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

为了避免这种特殊情况,我们需要分离两个减号(--),为此我们可以使用String#replace()方法,例如:

代码语言:javascript
复制
System.out.println("4--6".replace("--", "- -").split("\\s*(\\+|\\- |\\*|\\/)\\s*")[1]);

这将输出:-6

总有一天(我肯定)会有一段时间,即使这条或其他任何一条捷径都不够好,你需要真正解析这个方程。括号和括号在数学方程式中起着很大的作用,你需要一些东西来解析所有这些。正则表达式对于这类事情可能还不够好。

下面我提供了一种快速的方法,可以将方程分解为可能包含或不包含括号、括号、负数等的单个组件。也许这可以作为创建您自己的方程式分析器的起点(或者找到和使用已经开发的公式)。

代码语言:javascript
复制
/**
 * 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()]);
}

使用此方法:

代码语言:javascript
复制
String[] parts = splitEquation("(4+(-3/2))");
System.out.println(Arrays.toString(parts));

控制台窗口将显示:

代码语言:javascript
复制
[(, 4, +, (, -3, /, 2, ), )]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72308346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档