想象一下,我有一个字符串((3 * 5) * (2 * 23))
和一个字符串数组[((3, *, 5), *, (2, *, 23))]
。我想将前两个括号分开以获得"("
,"(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引擎为您进行评估。希望这可以帮助!