2016-02-14 98 views
0

我正在Java中做一個簡單的LISP解釋器,我一直無法弄清楚如何正確分割用戶的輸入,以便每個字符都在單獨的索引上,除了多位數字和可能的單詞。我也需要擺脫那種會帶來其他問題的白色空間。如何將一個字符串拆分爲一個數組,但將多個數字/單詞保存在一起?

現在,我使用用戶的輸入拆分成一個字符串,以計算行是:

String[] mainFunc = equation.replaceAll("\\s+", "").split("(?!^)"); 

Input: (+ 4 3) 
Output: 
0) (
1) + 
2) 4 
3) 3 
4)) 

這個工作對我需要什麼,直到2個或多個數字,因爲它會分裂他們成爲單獨的索引。然後我嘗試另一個正則表達式,我發現這裏幾乎花了我需要的照顧,這就是:

String[] mainFunc = equation.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)"); 

Input: (- 10 3) 
Output: 
0) (- 
1) 10 
2) 
3) 3 
4)) 

這幾乎是摸索出適合我,但後來我需要拆分第一個括號和運營商,以及擺脫那個空白區域(我試圖在循環中修剪,因爲某些原因我無法擺脫索引2中的空間)。

關於如何去做這件事的最佳方式的任何想法?

回答

0

分割表達式消耗,所以你可以吃那裏的空白。在空格或非數字/非空白之前/之後分割:

String[] mainFunc = equation.split("\\s+|(?<=[^ \\d])\\s*|\\s*(?=[()-])"); 

這適用於您的示例。


String equation = "(- 10 3)"; 
String[] mainFunc = equation.split("\\s+|(?<=[^ \\d])\\s*|\\s*(?=[^ \\d])"); 
Arrays.stream(mainFunc).forEach(System.out::println); 

輸出:

(
- 
10 
3 
) 
+0

非常感謝你,這正是我所需要的! – reekah

+0

@reekah我修改了正則表達式更一般的,例如處理其他操作符等 – Bohemian

0

根據您的問題,並提到的輸出,我會做如下

  • 裏面所有元素可以與空間被分割(\\ S +
  • 由於對第一和最後一個小括號沒有分裂術語。所以,你必須從內部而言分離像下面

( - 10 3)( - 10 3)

  • 現在,所有元素可以通過空間被簡單地劃分

這裏是我的代碼

String equation="(- 10 3)"; 
    equation=equation.replaceAll("\\(","\\("); 
    equation=equation.replaceAll("\\)"," \\)"); 
    String[] mainFunc = equation.split("\\s+"); 
    System.out.println(Arrays.toString(mainFunc)); 

和輸出是

[(, -, 10, 3,)] 
0

oh..finally我有一個簡單的答案..

String[] arr = a.split("(?=\\D)(?)"); 

,而不是d,W也適用..當有還的話。

但是,需要修剪。

相關問題