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()方法接受正則表達式作爲分隔符。

以下代碼顯示如何使用StringTokenizerString類的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對象作爲數據源。

重複調用StreamTokenizernextToken()方法。它填充StreamTokenizer對象的三個字段:ttypesvalnvalttype字段指示已讀取的令牌類型。

以下是類型(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