2015-05-26 85 views
3

我使用Java的StreamTokenizer爲了標記化代碼文本輸入。
當轉義字符出現在字符串中時,標記器忽略它們,而我想保持字符串相同。StreamTokenizer unescape字符

例如:

Input: String str = "STRIN\tG"; 

StreamTokenizer Output: STRIN G 
Wanted Output: STRIN\tG 

我的代碼:

BufferedReader reader = new BufferedReader(new FileReader("test.java")); 
StreamTokenizer tokenizer = new StreamTokenizer(reader); 

boolean eof = false; 
do { 
    int type = 0; 
    type = tokenizer.nextToken(); 
    switch (type) { 
     case StreamTokenizer.TT_EOF: 
       eof = true; 
       break; 

      case '"': 
       System.out.println(tokenizer.sval); 
       break; 
    } 
} while (!eof); 

編輯
我選擇與StreamTokenizer工作,因爲評論的良好的操控性去除

+1

不使用的標記生成器對於這一點,使用String類的split方法。 – Stultuske

+0

評論你的編輯(和問題):所以,你想輸出是完全一樣的輸入?爲什麼首先要檢查令牌?你認爲什麼代幣?你打算如何設置它們? – Stultuske

+0

那是正確的。 **串**的輸出應該與輸入完全相同。 – Presen

回答

1

StreamTokenizer constructor JavaDoc狀態:

所有字節值'\ u0000'到'\ u0020'都被認爲是空白。

\t是\ u000a ...你可以使用whitespaceChars()方法來改變這種行爲。

一個側面說明:如果您選擇println()\t大多數/所有終端將光標移動到下一個製表符的位置,而不是實際打印\t串...

乾杯,

+0

我不知道如何使用'whitespaceChars()'?我添加了行tokenizer.whitespaceChars(\ u0009,\ u0009);'並沒有幫助。謝謝! – Presen

0

添加在defaultcase,並根據需要處理字符:

switch (type) { 
     case StreamTokenizer.TT_EOL: 
      System.out.println("End of Line encountered."); 
      break; 
     case StreamTokenizer.TT_WORD: 
      System.out.print(tokenizer.sval); 
      break; 
     case StreamTokenizer.TT_EOF: 
      eof = true; 
      break; 
     case '"': 
      System.out.println(tokenizer.sval); 
      break; 
     default: 
      System.out.print((char) type); 
     }