我需要在字符串中获取以空格分隔的标记,但我还需要知道每个标记启动时原始字符串中的字符位置。有没有办法用StringTokenizer
执行此操作。另外,据我所知,这是一个遗产类;是否有更好的替代方法来使用StringTokenizer
。
答案 0 :(得分:7)
您应该始终使用String#split()
来分割字符串,而不是StringTokenizer
。
但是,由于您还希望在字符串中使用标记的位置,因此最好使用Pattern
和Matcher
类。你有Matcher#start()
方法,它给出了匹配模式的字符串的位置。
以下是一个例子: -
String str = "abc asf basdfasf asf";
Matcher matcher = Pattern.compile("\\S+").matcher(str);
while (matcher.find()) {
System.out.println(matcher.start() + ":" + matcher.group());
}
模式\\S+
匹配该字符串中的非空格字符。使用Matcher#find()
方法返回所有匹配的子字符串。
答案 1 :(得分:1)
您可以使用String.split()
String text = "hello world example";
int tokenStartIndex = 0;
for (String token : text.split(" ")) {
System.out.println("token: " + token + ", tokenStartIndex: " + tokenStartIndex);
tokenStartIndex += token.length() + 1; // +1 because of whitespace
}
打印:
token: hello, tokenStartIndex: 0
token: world, tokenStartIndex: 6
token: example, tokenStartIndex: 12
答案 2 :(得分:0)
我改进了micha的答案,因此它可以处理相邻的空间:
String text = "hello world example";
int start = 0;
for (String token : text.split("[\u00A0 \n]")) {
if (token.length() > 0) {
start = text.indexOf(token, start);
System.out.println("token: " + token + ", start at: " + start);
}
}
输出是:
token: hello, start at: 0
token: world, start at: 7
token: example, start at: 17