如何处理字符串以获得布尔输出

时间:2014-06-20 10:11:31

标签: java tokenize

我有一个像

这样的字符串
String str="(0 & (0 || 1))";

我想将其作为布尔输出处理。例如

(0||1)= 1
(0 & 1)=0

因此,根据字符串0

,我的最终输出应为"(0 & (0 || 1))";

你如何处理这个?

我尝试使用以下代码:

String str="(1 & (1 & 1))";

    str=str.replaceAll("1","true");

    str=str.replaceAll("0", "false");

    System.out.println(str);

    Boolean boolean2 = Boolean.parseBoolean(str);

    String sr=String.valueOf(str);

    System.out.println(boolean2);

2 个答案:

答案 0 :(得分:1)

Java没有eval()语句,可以使用代码并在程序中编译和解释。您可以使用Java编写这样的命令(您可以访问java解析器,可以编写自己的类加载器,...),但是当您已经使用该语言内置脚本支持时,为什么还要烦恼。

解释表达式的常用方法是为表达式语言编写解析器并解释生成的解析树(如果你不理解像#34;解析器"和#34;解析树"这对你来说不是最简单的路线)。如果操作正确,这是最快的方法。

但是,您也可以依赖内置脚本支持:

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

public class T {

    public static String interpret(String js) {
        try {
            ScriptEngineManager mgr = new ScriptEngineManager();
            ScriptEngine engine = mgr.getEngineByName("JavaScript");
            return engine.eval(js).toString();
        } catch (ScriptException e) {
            // Shouldn't happen unless somebody breaks the script
            throw new RuntimeException(e);
        }
    }

    public static void main(String args[]) {
        String str=args[0];
        str = str.replaceAll("1", "true");
        str = str.replaceAll("0", "false");
        str = str.replaceAll(" [&] ", "&&");
        str = str.replaceAll(" [|] ", "||");        
        System.out.println(interpret(str));
    }
}

请注意,这有点慢,如果练习要求您使用解析器,通常会被视为作弊。另外,由于JS是一种成熟的语言,它比使用定制的,受限制的解析器安全得多:你必须竭尽全力消毒JS以防止人们进入"邪恶的表达式&# 34;这可能会占用你的系统或做其他讨厌的事情。

对于

,输出为
javac T.java && java T "(0 & (0 || 1))"

(注意程序的第一个参数是要解析的表达式)

false

答案 1 :(得分:1)

嗯,基本上我有两种解决这个问题的方法:

  1. 为表达式创建自定义解析器。像ANTLRJavaCC之类的东西可以帮助你,但你甚至可以创建自己的词法分析器/解析器,有大量的文档和书籍 - 但它并不是那么简单。
  2. 更容易的是调用可以为您评估该表达式的引擎。以下是如何在JavaScript中执行此操作的示例,默认情况下位于JDK中:

    String str = "(true && (false || true))";
    
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
    System.out.println(engine.eval(str));