Java令牌和字符串拆分
Java有一些實用程序類,可將一個字符串分解成稱爲令牌的部分。通過定義分隔符字符來定義被認爲是令牌的字符序列。StringTokenizer
類位於java.util
包中。StreamTokenizer
類位於java.io
包中。StringTokenizer
將字符串拆分成令牌,而StreamTokenizer
是基於字符的流來訪問令牌。
StringTokenizer
StringTokenizer
對象根據對定界符的定義將字符串拆分爲令牌,它一次返回一個令牌。還可以隨時更改分隔符。可以通過指定字符串並接受默認分隔符來創建一個StringTokenizer
,它是空格,製表符,新行,回車符和換行符(「\t\n\r\f」) 如下:
StringTokenizer st = new StringTokenizer("here is my string");
可在創建StringTokenizer
時指定自己的分隔符,如下所示:下面的代碼使用空格,逗號和分號作爲分隔符。
String delimiters = " ,;";
StringTokenizer st = new StringTokenizer("my text...", delimiters);
可以使用hasMoreTokens()
方法來檢查是否有更多的令牌,以及nextToken()
方法從字符串中獲取下一個令牌。
還可以使用String
類的split()
方法將字符串基於分隔符拆分爲令牌。split()
方法接受正則表達式作爲分隔符。
以下代碼顯示如何使用StringTokenizer
和String
類的split()
方法。
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
String str = "This is a test, this is another test.";
String delimiters = " ,"; // a space and a comma
StringTokenizer st = new StringTokenizer(str, delimiters);
System.out.println("Tokens using a StringTokenizer:");
String token = null;
while (st.hasMoreTokens()) {
token = st.nextToken();
System.out.println(token);
}
}
}
執行上面的代碼,得到以下結果 -
Tokens using a StringTokenizer:
This
is
a
test
this
is
another
test.
StreamTokenizer
根據它們的類型來區分令牌,可使用StreamTokenizer
類。
import static java.io.StreamTokenizer.TT_EOF;
import static java.io.StreamTokenizer.TT_NUMBER;
import static java.io.StreamTokenizer.TT_WORD;
import java.io.IOException;
import java.io.StreamTokenizer;
import java.io.StringReader;
public class Main {
public static void main(String[] args) throws Exception {
String str = "This is a test, 200.89 which is simple 50";
StringReader sr = new StringReader(str);
StreamTokenizer st = new StreamTokenizer(sr);
try {
while (st.nextToken() != TT_EOF) {
switch (st.ttype) {
case TT_WORD: /* a word has been read */
System.out.println("String value: " + st.sval);
break;
case TT_NUMBER: /* a number has been read */
System.out.println("Number value: " + st.nval);
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
上面的程序使用StringReader
對象作爲數據源。可以使用FileReader
對象或任何其他Reader
對象作爲數據源。
重複調用StreamTokenizer
的nextToken()
方法。它填充StreamTokenizer
對象的三個字段:ttype
,sval
和nval
。 ttype
字段指示已讀取的令牌類型。
以下是類型(ttype
)字段的四個可能值:
字段
含義
TT_EOF
已達到流的結尾。
TT_EOL
已達到行尾。
TT_WORD
單詞(字符串)已從流中讀取爲令牌。
TT_NUMBER
數字已從流中讀取爲令牌。
如果ttype
具有TT_WORD
,則字符串值存儲在其字段sval
中。如果返回TT_NUBMER
,其數值存儲在nval
字段中。
上面的代碼生成以下結果。
String value: This
String value: is
String value: a
String value: test
Number value: 200.89
String value: which
String value: is
String value: simple
Number value: 50.0