2014-04-16 30 views
0

我有一個StreamTokenizer將標記字符串。我感興趣的是從String中獲取下一個標記的方法,以及剩餘的String(沒有我們剛剛拿過的標記)。使用StreamTokenizer獲取下一個令牌和剩餘字符串

public static void parseString(String s){ 
    StreamTokenizer st = new StreamTokenizer(new StringReader(s)); 

    try { 
     while (st.nextToken() != st.TT_EOF){ 
      if (st.ttype == st.TT_WORD){ 
       System.out.println("Word: " + st.sval); 
       if (st.sval.equals("start")){ 
        start(st.sval, ???) 
       } 
      } 
      else if (st.ttype == st.TT_NUMBER){ 
       System.out.println("Number: " + st.nval); 

      } 
      else if (st.ttype == '\''){ 
       System.out.println(st.sval); 
      } 
      else{ 
       System.out.println((char)st.ttype); 
      } 
     } 
    } catch (IOException e){} 
} 



public String start(String text, String theRest){ 
    return "<start>" + text + "" + parseString(theRest) + "</start>"; 
} 

有些事情我已經試過:

  • 我剛剛使用原來的String,但它經過標記化它StreamTokenizer極不改變一個字符串嘗試(我忘了這個詞來形容這個)。

  • 我可以找到當前令牌的索引,並將該令牌從原始字符串中分割出來。

我想知道是否有更優雅的方式去做這件事?

回答

1

關於第一個重點,我相信你所想的這個詞可能是「不可變的」。你是對的,任何似乎在操縱字符串的東西其實都是創建一個新的字符串;原文保持不變。

對於第二個要點,坦率地說,我會建議同樣如此。目前我想不出一個更好的方法。

下面是一個普通的例子:

int startIndex = s.indexOf(currentToken) + currentToken.length; 

String remainingString = s.subString(startIndex, s.length-1); 

如果我的字符串是「大家好,我的名字是保羅」,和當前標記是「名」,的remainingString的結果應該是「保羅」。

你可以很容易地將其封裝在某個輔助方法中,以幫助保持事物的清潔和分離。

可能不是您正在尋找的答案,但希望這有些幫助。

+1

謝謝保羅,我將使用索引和子字符串,直到其他人建議更聰明的方式。 –