2015-04-24 50 views
1

查看StreamTokenizer here的演示代碼。當字符串中有/(似乎只需在StringReader的字符串之間添加/)似乎不能正常工作。下面是提到的鏈接代碼,StreamTokenizer劃分運算符的行爲「/」

StreamTokenizer tokenizer = new StreamTokenizer(
    new StringReader("Mary had 1 little lamb...")); 

    while(tokenizer.nextToken() != StreamTokenizer.TT_EOF){ 

     if(tokenizer.ttype == StreamTokenizer.TT_WORD) { 
      System.out.println(tokenizer.sval); 
     } else if(tokenizer.ttype == StreamTokenizer.TT_NUMBER) { 
      System.out.println(tokenizer.nval); 
     } else if(tokenizer.ttype == StreamTokenizer.TT_EOL) { 
      System.out.println(); 
     } 
    } 

例如,對於字符串"Mary had 1 little lamb...",輸出

Mary 
had 
1.0 
little 
lamb... 

對於字符串,"Mary had 1 /little lamb...",輸出

Mary 
had 
1.0 
  • 是否/工作作爲EOF令牌?如果是這樣,爲什麼?
  • 有什麼辦法可以將/區分爲除EOF以外的其他標記。
+0

似乎沒給我。你能分享一個代碼片段,你得到的輸出和你期望的輸出嗎? – Mureinik

+0

究竟哪個不行?注意:['StreamTokenizer'](https://docs.oracle.com/javase/8/docs/api/java/io/StreamTokenizer.html)已棄用。 – Maroun

+0

我編輯了這個問題。你現在可以找到更多細節。 – user148865

回答

3

根據the documentation/StreamTokenizer中的註釋字符。它後面的所有內容,直到EOL或EOF都將被忽略並且不會被標記。

例如,繼續你給的例子,如果字符串爲"Mary had 1/2\n little lamb..."2被註釋掉了,不會被符號化,並\n後標記化將繼續。因此,輸出將是:

Mary 
had 
1.0 
little 
lamb... 
+0

爲什麼downvote? – Mureinik

+0

@Mureinik這是非常好的回答哥們:)。可能是downvoters預期更多(我不知道是什麼) –

+0

@Mureinik:什麼是我可以解析和打印'/'作爲一個單獨的令牌的首選方式?一種方法是用一些字符串替換'/',我們確信這些字符串不會以原始字符串出現,並且在if-else條件下檢查並用'/'替換該特定的字符串。但這似乎並不優雅。有沒有更好的方法? – user148865

1

只是增加了以上回答 。既然/是在StreamTokenizer中註釋字符並持續到該行的末尾。因此,你必須添加任何新行\n\r在String 所以"Mary had 1/\n little /\nlamb...""Mary had 1/\r little/\rlamb..."既會爲你工作