2013-04-29 287 views
2

數組如果我有:將字符串轉換爲字符串

Scanner input = new Scanner(System.in); 

System.out.println("Enter an infixed expression:"); 
String expression = input.nextLine(); 

String[] tokens; 

如何掃描周圍的空間中綴表達式一次一個令牌,由左到右,投放到字符串數組?這裏的token被定義爲一個操作數,運算符或圓括號。

示例: 「3 +(9-2)」 ==>令牌= [3] [+] [(] [9] [ - ] [2] [)]

+4

字符串的'length()'和'charAt(int)'可能會有所幫助。不要使用數組,請使用列表。 – 2013-04-29 18:34:43

+1

輸入字符之間總會有空格嗎?你的例子表明不是,但你也提到「周圍空間」。 – 2013-04-29 18:38:15

回答

0

我認爲這將是最簡單的方法是將行讀入一個字符串,然後根據空間進行拆分。有一個方便的字符串函數split可以爲你做到這一點。

String[] tokens = input.split(""); 
+0

我不確定你需要拆分空間。 – Achrome 2013-04-29 18:38:50

+0

啊,你是對的。沒有看到'-'標誌之間沒有空格。修復。 – nook 2013-04-29 18:40:41

+0

This results in:[3] [] [+] [] [(] [9] [ - ] [2] [)]。帶空格的索引不需要在那裏 – AlishasPayPal 2013-04-29 18:46:03

2
String test = "13 + (9-2)"; 

List<String> allMatches = new ArrayList<String>(); 
Matcher m = Pattern.compile("\\d+|\\(|\\)|\\+|\\*|-|/") 
    .matcher(test); 
while (m.find()) { 
    allMatches.add(m.group()); 
} 

有人可以測試這個嗎?

+1

這肯定會分裂數字? '13'會變成'[1] [3]'。 – 2013-04-29 18:51:29

+0

@DuncanJones它會,我添加了一些新的代碼,但我現在不能運行它 – 2013-04-29 18:58:52

+0

對不起,不起作用。它找到了數字,但也有很多空的字符串。 – 2013-04-29 19:16:39

0

這可能是矯枉過正的例子,但如果它變得更復雜,請看看Java編譯器編譯器JavaCC。 JavaCC允許您基於語法定義在Java中創建解析器。

請注意,這不是一個簡單易用的工具。但是,語法定義比相應的正則表達式更容易閱讀。

0

如果令牌[]必須爲String可以使用此

String ex="3 + (9-2)"; 
    String tokens[]; 
    StringTokenizer tok=new StringTokenizer(ex); 
    String line=""; 
    while(tok.hasMoreTokens())line+=tok.nextToken(); 

    tokens=new String[line.length()]; 
    for(int i=1;i<line.length()+1;i++)tokens[i-1]=line.substring(i-1,i); 

令牌可以是一個charArray這樣:

String ex="3 + (9-2)"; 
    char tokens[]; 
    StringTokenizer tok=new StringTokenizer(ex); 
    String line=""; 
    while(tok.hasMoreTokens())line+=tok.nextToken(); 

    tokens=line.toCharArray(); 
0

的碼本(IMHO優雅)單線作品(測試):

String[] tokens = input.split("(?<=[^ ])(?<!\\B) *"); 

這個正則表達式還適用於包含多個字符數(例如123)的輸入,這些字符數將被拆分成單獨的cha但是對於非字邊界的負面後視(?<!\\B)

第一個後視(?<=[^ ])可防止初始空白字符串在開始輸入時分裂,並確保空間被消耗。

正則表達式" *"的最後一部分確保消耗空間。