2014-06-20 22 views
-1

我有一個像如何處理字符串取得布林輸出

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); 
+0

你不能因爲即使解析括號與正則表達式做到這一點是不可能的。簡單地標記輸入並構建一個分析樹,然後編寫一個評估函數。 – perreal

+0

可以請你解釋(在代碼中)如何做到這一點?我嘗試了一些使用標記器的過程 StringTokenizer str1 = new StringTokenizer(str); \t \t而(str1.hasMoreElements()){ \t \t \t如果(!(str1.nextElement()。等於( 「(0」))){ \t \t \t Object對象=(對象)str1.nextElement( ); \t \t \t的System.out.println(對象); \t \t \t} \t \t} 但我沒有得到它 – user3628323

+1

請包括你已經嘗試*在你的問題*代碼 –

回答

1

Java沒有一個eval()語句可以採取串代碼和編譯和內解釋它的程序。你可以用Java編寫這樣一個命令(你可以訪問java解析器,可以編寫你自己的類加載器,...),但是爲什麼你已經有了內置的腳本支持。

解釋表達式的常用方法是爲您的表達式語言編寫解析器並解釋生成的解析樹(如果您不理解「解析器」和「解析樹」這樣的單詞,那麼這不是最簡單的路線) 。如果正確完成,這是最快的方法。

但是,您也可以依靠內置的腳本支持:

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,以防止人們進入可以綁定的「惡意表達式」建立你的系統或做其他討厭的東西。

輸出,對於

javac T.java && java T "(0 & (0 || 1))" 

(注意,第一個參數程序來解析表達式)

false 
+0

絕對燦爛! –

+0

@tucuxi:我是這個腳本Engine的引擎....但輸出不正確我猜想所需的輸出應該是錯誤的。 你可以告訴它是如何工作的,它是如何賦予真實性的? – user3628323

+0

@tucuxi:什麼是ScriptEnginemanager它是一個jar或waht?我怎樣才能將它導入到我的工作區? – user3628323

1

好了,基本上有2種方式是在我腦海中以解決此問題:

  1. 爲您的表達式創建自定義分析器。像ANTLRJavaCC這樣的東西可以幫助你,但你甚至可以創建你自己的詞法分析器/解析器,有大量的文檔和書籍 - 但這並不是那麼簡單。
  2. 稍微簡單一點就是調用一個可以爲你評估表達式的引擎。下面是一個例子如何做到這一點在JavaScript中,這是你的JDK中默認爲:

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

+1的全部輸出。我們幾乎同時寫了同樣的東西。 – tucuxi

+0

Thx,絕對:-) – rlegendi