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