如何拆分两个连续括号?

时间:2015-11-20 16:41:07

标签: java split

想象一下,我有一个字符串((3 * 5) * (2 * 23))和一个字符串数组[((3, *, 5), *, (2, *, 23))]。我想将前两个括号分开以获得"(""(3"。在这种情况下,拆分功能不起作用,它返回一个空字符串。

3 个答案:

答案 0 :(得分:2)

您可能正在寻找的是(?=X)(?<=X),它在X之前或之后分割,但仍然在字符串中捕获X.关于如何使用这些的确切选择取决于您。由于您指定了"(""(3",因此您可能希望从此开始:

str.split("(?<=[)])|(?=[(])|\\s+");

哪个字符串以任何字符串结尾),任何字符串开头(,并且还删除空格。但是后视或前瞻似乎会干扰间距,因此您可以添加一些内容来查找与之相关的空格每个括号,而不是通过用=替换!来保留它们。即

str.split("(?<=[)])(?!\\s)|(?<!\\s)(?=[(])|\\s+");

现在这里有很多东西可以接受,我不认为像"(3"这样的字符串会在你尝试开始评估时很好,所以你可能想调整一下它甚至更进一步。因此,您可能需要查看tutorials示例和Pattern以获取对所有各种模式的引用。

答案 1 :(得分:1)

您需要做的是,不是拆分文本,而是创建允许您解析文本的内容。 这是一个简单的代码示例,可帮助您实现最终目标。我不建议你使用它,但我希望它能让你知道你需要去哪个方向:

公共课Lime;

static enum TokenType{
    LEFT_BRACKET,RIGHT_BRACKET,NUMBER,OPERATOR
}

static interface Token {
    TokenType getType();
    String getValue();
}

public static void main(String[] args) {
    String expr = "((3*5)*(2*23))";
    System.out.println(parse(expr));

}

private static String parse(String expr) {
    Token[] tokens = getTokens(expr);
    Stack<Token> stack = new Stack<Token>();
    for (Token token : tokens) {

        if (token.getType()==TokenType.NUMBER && !stack.isEmpty() && token.getType()==TokenType.OPERATOR) {
            stack.push(eval(token, stack.pop(), stack.pop()));
        } else if (token.equals(")")) {
            token = stack.pop();
            stack.pop();
            if (token.getType()==TokenType.NUMBER  && !stack.isEmpty() && isOp(stack.peek())) {
                stack.push(eval(token, stack.pop(), stack.pop()));
            } else {
                stack.push(token);
            }
        } else {
            stack.push(token);
        }
    }
    return stack.pop().getValue();
}



private static Token eval(Token a, Token operator, Token b) {
    switch (operator.getValue()) {
    case "*":
        return createNumberToken((Integer.parseInt(a.getValue()) * Integer.parseInt(b.getValue())));
    }
    //
    return null;
}
 private static Token[] getTokens(String expr) {
        // TODO to be implemented
        return null;
    }
private static Token createNumberToken(int i) {
    // TODO to be implemented
    return null;
}

}

为了不给你解决方案,我留下了创造令牌未实现的方法。这应该可以让您简要了解您的作业是什么。我还建议您阅读Interpreter Design Pattern

答案 2 :(得分:0)

像这样的问题有很多不同的方法。这是一次尝试,不涉及原始字符串的任何类型的解析。这也假设String是一个有效的表达式。

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Solution {           
    public static void main(String[] args) throws ScriptException{
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript");  //Create a script engine
        String expression = "((3 * 5) * (2 * 23))";
        System.out.println(engine.eval(expression));

        //or you can do it in one line
        System.out.println(new ScriptEngineManager().getEngineByName("JavaScript").eval(expression));
    }
}

这利用内置的JavaScript引擎为您进行评估。希望这可以帮助!